Redis键过期的删除策略与内存淘汰机制

56 阅读2分钟

Redis键过期的删除策略

键的过期删除策略

常见的过期删除策略是惰性删除定期删除定时删除

  • 惰性删除:只有访问这个键时才会检查它是否过期,如果过期则清除。

    image-20231103095104564

    优点:最大化的节约CPU资源。

    缺点:如果大量过期键没有被访问,会一致占用大量内存。

  • 定时删除:为每个设置过期时间的key都创造一个定时器,到了过期时间就清除。

    优点:可以立即清除过期的键。

    缺点:会占用大量的CPU资源去处理过期的数据。

  • 定期删除:每隔一段时间,就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key)该策略是惰性删除和定时删除的一个折中,既避免了占用大量CPU资源又避免了出现大量过期键不被清除占用内存的情况。

    定期清理有两种模式:

    SLOW模式是定时任务,执行频率默认为10hz,每次不超过25ms,以通过修改配置文件redis.conf 的hz 选项来调整这个次数

    FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms

Redis的过期删除策略:惰性删除 + 定期删除两种策略进行配合使用

Redis的内存淘汰机制?

当存入的数据超过Redis最大允许内存后,会触发Redis的内存淘汰策略。在Redis4.0前一共有6种淘汰策略。

  • volatile-lru:当Redis内存不足时,会在设置了过期时间的键中使用LRU算法移除最近最少使用的键。
  • volatile-ttl:从设置了过期时间的键中移除将要过期的。
  • volatile-random:从设置了过期时间的键中随机淘汰一些。
  • allkeys-lru:根据LRU算法移除一些键。
  • allkeys-random:随机移除某些键。
  • noeviction:新的写入操作会报错。

前三个是在设置了过期时间的键的空间进行移除,后三个是在全局的空间进行移除。

4.0版本后新增以下两种:

  • volatile-lfu:从设置过期时间的键中移除一些最不经常使用的键(Least Frequently Used,LFU)
  • allkeys-lfu:从所有键中移除一些最不经常使用的键。