Redis的过期策略和内存淘汰机制


Redis过期策略

redis过期删除策略通常有三种:
  1. 定时删除
    在设置某个key的过期时间同时创建一个定时器,定时器负责监视key,过期则自动删除,虽然内存及时释放,但是十分消耗CPU资源。
  2. 定期删除
    Redis默认每隔100ms就随机抽取部分设置了过期时间的key,检测这些key是否过期,如果过期了就将其删除。随机抽取部分,而不是全部,全部都去检测一遍的话CPU负载就会很高。难以确定删除操作执行的时长和频率,如果执行的太频繁,定期删除策略变得和定时删除策略一样,消耗CPU;如果执行的太少,那又和惰性删除一样。
  3. 惰性删除
    当需要该key时,检查其是否过期,如果过期就删掉它,反之返回该key。

redis采用的是定期删除+惰性删除策略。这样还是存在一定问题,如果定期删除没删除key,然后也没即时去请求key,也就是说惰性删除也没生效,那么Redis的内存负载也会越来越高,那就应该采用内存淘汰机制了。

Redis内存淘汰机制

在配置文件redis.conf 中,可以通过参数maxmemory来设定最大内存,不设定该参数默认是无限制的。当内存不足时,就会采取内存淘汰机制,Redis内存淘汰方式有以下八种:
  1. noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。(默认选项,一般不会选用)
  2. allkeys-lru:当内存不足以容纳新写入数据时,在整个键空间中,移除最近最少使用的key。(这个是最常用的)
  3. allkeys-lfu:当内存不足以容纳新写入数据时,在整个键空间中,移除最不经常(最少)使用的key。
  4. allkeys-random:当内存不足以容纳新写入数据时,在整个键空间中,随机移除某个key。
  5. volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
  6. volatile-lfu:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最不经常(最少)使用的key。
  7. volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
  8. volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

在配置文件redis.conf 中,可以通过参数maxmemory-policy来设置淘汰的方式。

总结

过期策略用于处理过期的缓存数据;内存淘汰策略用于处理内存不足时的需要申请额外空间的数据。所以内存淘汰策略的选取并不会影响过期的key的处理。

参考:
https://blog.csdn.net/qq_33807380/article/details/124112600
https://blog.csdn.net/itcats_cn/article/details/82391719