Redis 内存淘汰策略
Redis 的内存淘汰策略是指在 Redis 用于缓存的内存不足时,如何处理需要申请额外空间的数据;Redis的内存淘汰策略的选取并不会影响过期的key的处理,过期策略用于处理过期的缓存数据;
# 常见的内存淘汰策略
- noeviction:当内存不足时,新写入操作会报错;
- allkeys-lru:当内存不足时,在所有的 key 中移除最近最少使用的 key;
- allkeys-lfu:当内存不足时,在所有的 key 中移除最不常用的 key;
- allkeys-random:当内存不足时,在所有的 key 中随机移除某个 key;
- volatile-lru:当内存不足时,在设置了过期时间的 key 中移除最近最少使用的 key;
- volatile-lfu:当内存不足时,在设置了过期时间的 key 中移除最不常用的 key;
- volatile-random:当内存不足时,在设置了过期时间的 key 中随机移除某个 key;
- volatile-ttl:当内存不足时,在设置了过期时间的 key 中离过期时间最近的 key;
如果没有设置过期时间的 key,则 volatile-lru、volatile-lfu、volatile-random 和 volatile-ttl 策略的行为类似于 noeviction;
# 淘汰策略的选择
- 如果访问某些 key 的频率远远高于其他元素,无论是否设置了过期时间,可以使用 allkeys-lru 策略;
- 如果连续循环访问所有的 key,并且期望分布是均匀时,无论是否设置了过期时间,可以使用 allkeys-random 策略;
- 如果有大量长期保留的数据,但同时也有一些低访问频率的数据,无论是否设置了过期时间,可以使用 allkeys-random 策略;
- 如果在创建 key 时设置了过期时间,有很多需要精确控制过期时间的数据,可以使用 volatile-ttl 策略;
- 如果在创建 key 时设置了过期时间,并且这些 key 对于淘汰顺序没有特别的要求,可以使用 volatile-random 策略;
- 如果在创建 key 时设置了过期时间,某些 key 只是临时数据,访问频率较低,可以使用 volatile-lru 策略;
- 如果在创建 key 时设置了过期时间,但是访问频率很低,可以使用 volatile-lfu 策略;
# 近似 LRU 算法
- Redis LRU 算法采从一池子的候选人中进行淘汰,提高了算法的性能,能够更接近真实 LRU 算法的行为,可以通过更改每次要检查的淘汰样本数来调整算法的精度;
- Redis LRU 算法是一种近似的 LRU 的算法,因为真正的 LRU 算法会消耗更多的内存;
# 新的 LFU 模式
- 在 LFU 模式下,Redis 将尝试跟踪 key 访问的频率,很少使用的 key 被淘汰,经常使用的 key 通常有更大的概率保留在内存中;
- LFU 类似于 LRU,它使用一个概率计数器来估计对象访问频率,每个对象仅使用几个位,并结合衰减周期,以便计数器随时间推移而减少;
- LFU 同样具有某些可调参数,可以调整频率阈值与计数器范围;
编辑 (opens new window)
上次更新: 2024/02/21, 22:09:25