过期key删除策略

发布时间 2023-03-29 16:01:45作者: zhengbiyu

被动删除

当读/写一个key时,redis首先会检查这个key是否存在,如果存在且已过期,则直接删除这个key并返回nil给客户端。

定期删除

redis中有一系列的定期任务(serverCron),这些任务每隔一段时间就会运行一次,其中就包含清理过期key的任务,运行频率由配置文件中的hz参数来控制,取值范围1~500,默认是10,代表每秒运行10次。清理过程如下:
  1. 遍历所有的db
  2. 从db中设置了过期时间的key的集合中随机检查20个key
  3. 删除检查中发现的所有过期key
  4. 如果检查结果中25%以上的key已过期,则继续重复执行步骤2-3,否则继续遍历下一个db
调大hz将会提高redis定期任务的执行频率,如果你的redis中包含很多过期key的话,可以考虑将这个值调大,但要注意同时也会增加CPU的压力,redis作者建议这个值不要超过100。

强制删除

如果redis使用的内存已经达到maxmemory配置的值时,会触发强制清理策略,清理策略由配置文件的maxmemory-policy参数来控制,有以下这些清理策略:
  • volatile-lru:使用LRU算法对设置了过期时间的key进行清理(默认值)
  • allkeys-lru:使用LRU算法对所有key进行清理
  • volatile-lfu:使用LFU算法对设置了过期时间的key进行清理(redis 4.0版本开始支持)
  • allkeys-lfu:使用LFU算法对所有key进行清理(redis 4.0版本开始支持)
  • volatile-random:对所有设置了过期时间的key进行随机清理
  • allkeys-random:从所有key进行随机清理
  • volatile-ttl:清理生存时间最小的一部分key
  • noeviction:不做任何清理,拒绝执行所有的写操作
为了节省内存和性能上的考虑,上述的清理策略都不需要遍历所有数据,而是采用随机采样的方法,每次随机取出特定数量(由maxmemory-samples配置项控制,默认是5个)的key,然后在这些key中执行LRU算法、RANDOM算法、或者是找出TTL时间最小的一个key,然后进行删除。
注:这个清理过程是阻塞的,直到清理出足够的内存空间才会停止。