本文已参与「新人创作礼」活动,一起开启掘金创作之路。
缓存回收
缓存回收、删除过期key
redis是怎么删除过期key的?缓存是如何回收的?
1,定期删除
:定期在后台随机检查一批key,删除已经过期的key,若过期比例超过25% 也会检查。
缺点:可能有很多过期key没有被检查到。
2,惰性删除
:访问一个key时,若key过期则删除。
缺点:内存释放不及时,无法释放未被请求的过期key。
两种方式配合,可以尽量把无用空间回收。
也存在问题,如果定期删除没处理过期key,也没有请求过期key,redis的内存会越来越高,达到限制时,会执行内存淘汰策略。
缓存淘汰策略
Redis共提供了8中缓存淘汰策略,其中 volatile-lfu 和 allkeys-lfu 是Redis 4.0版本新增的。
1、noeviction:不淘汰数据。一旦缓存被写满,再有写请求时不再提供服务,直接返回错误。redis作为缓存时不常用。
volatile(在设置了过期key的键值对中)
2、volatile-ttl:在设置了过期时间的键值对中,移除即将过期的键值对。
3、volatile-random:在设置了过期时间的键值对中,随机移除某个键值对。
4、volatile-lru:在设置了过期时间的键值对中,移除最近最少使用的键值对。
5、volatile-lfu:在设置了过期时间的键值对中,移除最近使用频率最少的键值对(4.0 版本后新增)
allkeys(在所有键值对中)
6、allkeys-random:在所有键值对中,随机移除某个key。
7、allkeys-lru:在所有的键值对中,移除最近最少使用的键值对。
8、allkeys-lfu:在所有的键值对中,移除最近使用频率最少的键值对(4.0 版本后新增)
通常推荐使用 allkeys-lru 策略。这样可以把最近最常访问的数据留在缓存中,提升应用的访问性能。
如果数据有明显的冷热数据区分,建议使用 allkeys-lru 策略。
如果数据没有明显的冷热数据区分,建议使用 allkeys-random 策略,随机选择淘汰的数据就行。