当前位置:   article > 正文

Redis 过期策略以及内存淘汰机制_redis过期策略和内存淘汰机制

redis过期策略和内存淘汰机制

Redis过期策略

一、定期删除

定期删除类似一个守护线程,每间隔一段时间就执行一次(默认100ms一次,可以通过修改配置文件redis.conf 的hz选项来调整这个次数),将过期的Key进行删除,具体过程如下:

 步骤1:从过期字典中随机选出20个key 
 步骤2:删除这20个key中已经过期的key 
 步骤3:如果过期的key的比例超过了1/4,那就重复从步骤1开始执行
  • 1
  • 2
  • 3

之所以不一次性将所有过期的key都删除,是从性能角度做出的考量,当过期key特别多时,每次扫描全部的过期key,都会给CPU带来较大负担。既然无法一下子全部删除,那么我就进行多次(指每100ms执行一次,提高删除的频次)、部分的删除(只每次只抽取部分进行删除),以此来达到效果。

当然,这样随机的抽取过期key进行删除明显会遗漏很多过期key,这就要用到惰性删除

二、惰性删除

惰性删除即当查询某个Key时,判断该key是否已过期,如果已过期则从缓存中删除,同时返回空。

小结:
再回头看看过期策略,无论是定期删除还是惰性删除,都是一种不完全精确的删除策略,始终还是会存在已经过期的key无法被删除的场景。
而且这两种过期策略都是只针对设置了过期时间的key,不适用于没有设置过期时间的key的淘汰,所以,Redis还提供了内存淘汰策略,用来筛选淘汰指定的key。

Redis淘汰策略

一、不进行淘汰的策略noevition

此策略不会对缓存的数据进行淘汰,当内存不够了就会报错,因此,如果真实数据集大小大于缓存容量,就不要使用此策略

二、会进行淘汰的策略

1. volatile前缀

特点:针对设置了过期时间的key,在设置了过期时间的数据中筛选
volatile-random:随机删除
volatile-ttl:根据过期时间先后进行删除,越早过期的越先被删除
volatile-lru:使用 LRU 算法  进行筛选删除;least recently used,也就是最近最久使用算法,也就是淘汰使用时间最旧的数据
volatile-lfu:使用lfu算法进行淘汰;leastly frequently used,最近最少使用,也就是挑选出最近使用次数最少的key
  • 1
  • 2
  • 3
  • 4
  • 5

2. allkeys前缀

 特点:对所有key一视同仁
 allkeys-random:随机删除allkeys-lru:使用 LRU 算法进行筛选删除
 allkeys-lfu:使用 LFU 算法进行筛选删除,也就是淘汰使用时间最旧的数据
 allkeys-lru:针对所有key使用lru算法进行淘汰,也就是淘汰最近使用次数最少的key
  • 1
  • 2
  • 3
  • 4

总结:Redis是通过 定期删除+惰性删除+配置的内存淘汰机制 来保证内存可用的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/685050
推荐阅读
相关标签
  

闽ICP备14008679号