Redis之key的淘汰策略
淘汰策略概述
redis作为缓存使用时,在添加新数据的同时自动清理旧的数据。这种行为在开发者社区众所周知,也是流行的memcached系统的默认行为。
redis中使用的LRU淘汰算法是一种近似LRU的算法。
淘汰策略
针对淘汰策略,redis有一下几种配置方案:
1、noeviction:当触发内存阈值时,redis只读不写;
2、allkeys-lru:针对所有的key,执行LRU(最近最少使用)策略;
3、allkeys-lfu:针对所有的key,执行LFU(最低频使用)策略;
4、volatile-lru:针对设置了过期时间的key,执行LRU(最近最少使用)策略;
5、volatile-lfu:针对设置了过期时间的key,执行LFU(最低频使用)策略;
6、allkeys-random:针对所有key,进行随机淘汰;
7、volatile-random:针对设置了过期时间的key,进行随机淘汰;
8、volatile-ttl:针对设置了过期时间的key,淘汰剩余过期时间最短的;
根据应用场景选择合适的淘汰策略是非常重要的,我们可以在程序运行时实时重置淘汰策略,并使用Redis INFO输出来监控缓存未命中和命中的数量,以优化设置。
根据以往使用惯例:
- 当你希望某些元素的子集被访问的频率高于其他元素,或者当你不知道怎么选择淘汰策略时,allkeys-lru策略是一个很好的选择;
- 当你在循环访问redis,且所有的key是被连续扫描时,或者你希望key过期时间均匀分布时,allkeys-random策略是一个很好的选择;
- 如果你希望基于key不同的TTL时间筛选出哪些key可被淘汰,volatile-ttl策略是一个很好的选择;
还有一点是为key设置过期时间会占用内存,因此使用allkeys-lru这样的策略会更节省内存,因为在内存压力下不需要对key进行过期设置。
淘汰策略如何工作
淘汰过程如下:
- 客户端执行一条指令,需要添加一批数据;
- redis检测缓存阈值限制,如果超过阈值则执行淘汰策略;
- 执行指令等等;
因此在redis的使用过程中,我们可能不断的超过内存阈值限制,然后执行淘汰策略再将内存恢复到阈值之下。
近似LRU算法
redis lru算法是一个近似lru算法,这意味着针对整个key集合,redis在执行lru策略时可能不会很精准的淘汰掉最应该被淘汰的key,相反的是,redis会通过抽样一小部分key,并淘汰采样key中最该被淘汰的。