前言
本文参考源码版本
redis6.2
Redis 基于内存设计,所有数据存放在内存,随着时间推移,内存占用也越来也高 ...
由于内存容量这个物理限制,我们需要在内存使用量达到一定比例后,做一些内存清理工作,以保证有足够的空间来完成正常的处理。
在 Redis 中,完成这个工作的就是本文的主角 ------- Redis 内存淘汰机制。
- 一定比例:在 redis 中就是 maxmemory 阈值
- 淘汰策略:在 redis 中目前有两种流行的算法:LRU 与 LFU 算法
如果让你来设计一款内存淘汰策略,你会考虑哪些方面?
1)首先,从用户体验上看:
- 不要影响服务正常使用,实现平滑淘汰
- 用户透明,用户不需要做任何额外操作
2)其次,从系统层面来看:
-
何时清理?
-
清理哪些?
-
清理多少?
-
怎样清理?
-
清理频次?
带着这些问题,我们一起来探索下,Redis 是如何考虑并实现的。
一、淘汰策略
淘汰策略也是可以在 redis.config 中指定:
maxmemory-policy ...
复制代码
截止目前,共有 8 种淘汰策略,如下:
1. 全局淘汰:
1)allkeys-lru:淘汰范围是所有 keys,淘汰最久未使用的 key
2)allkeys-lfu:淘汰范围是所有 keys,淘汰使用频次最少的
3)allkeys-random:淘汰范围:所有 keys,随机淘汰 key
2. 淘汰 expire :
1)volatile-lru:淘汰范围:所有设置了 expire 时间的 keys,淘汰最久未使用的 key
2)volatile-lfu:淘汰范围:所有设置了 expire 时间的 keys,淘汰使用频次最少的 key
3)volatile-random:淘汰范围:所有设置了 expire 时间的 keys,随机淘汰 key
4)volatile-ttl:淘汰范围:所有设置了 expire 时间的 keys,淘汰 ttl 剩余时间最少的 key
3. 不淘汰:
1)noeviction:不淘汰,意味着达到限制时,将无法存储
二、淘汰算法
目