Redis之key的淘汰策略

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中最该被淘汰的。

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Redis之key的淘汰策略