赞
踩
定期删除类似一个守护线程,每间隔一段时间就执行一次(默认100ms一次,可以通过修改配置文件redis.conf 的hz选项来调整这个次数),将过期的Key进行删除,具体过程如下:
步骤1:从过期字典中随机选出20个key
步骤2:删除这20个key中已经过期的key
步骤3:如果过期的key的比例超过了1/4,那就重复从步骤1开始执行
之所以不一次性将所有过期的key都删除,是从性能角度做出的考量,当过期key特别多时,每次扫描全部的过期key,都会给CPU带来较大负担。既然无法一下子全部删除,那么我就进行多次(指每100ms执行一次,提高删除的频次)、部分的删除(只每次只抽取部分进行删除),以此来达到效果。
当然,这样随机的抽取过期key进行删除明显会遗漏很多过期key,这就要用到惰性删除
惰性删除即当查询某个Key时,判断该key是否已过期,如果已过期则从缓存中删除,同时返回空。
小结:
再回头看看过期策略,无论是定期删除还是惰性删除,都是一种不完全精确的删除策略,始终还是会存在已经过期的key无法被删除的场景。
而且这两种过期策略都是只针对设置了过期时间的key,不适用于没有设置过期时间的key的淘汰,所以,Redis还提供了内存淘汰策略,用来筛选淘汰指定的key。
此策略不会对缓存的数据进行淘汰,当内存不够了就会报错,因此,如果真实数据集大小大于缓存容量,就不要使用此策略
特点:针对设置了过期时间的key,在设置了过期时间的数据中筛选
volatile-random:随机删除
volatile-ttl:根据过期时间先后进行删除,越早过期的越先被删除
volatile-lru:使用 LRU 算法 进行筛选删除;least recently used,也就是最近最久使用算法,也就是淘汰使用时间最旧的数据
volatile-lfu:使用lfu算法进行淘汰;leastly frequently used,最近最少使用,也就是挑选出最近使用次数最少的key
特点:对所有key一视同仁
allkeys-random:随机删除allkeys-lru:使用 LRU 算法进行筛选删除
allkeys-lfu:使用 LFU 算法进行筛选删除,也就是淘汰使用时间最旧的数据
allkeys-lru:针对所有key使用lru算法进行淘汰,也就是淘汰最近使用次数最少的key
总结:Redis是通过 定期删除+惰性删除+配置的内存淘汰机制 来保证内存可用的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。