redis 过期策略和内存淘汰机制
我们都知道redis可以为指定的key设置过期时间,比如为key设置了1小时后过期,那一小时之后redis如何处理这个key的呢?
答案是定期删除和惰性删除。
以下先介绍下这两种删除策略的定义和流程:
惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检査取得的键是否 过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
定期删除:每隔一段时间,程序就对数据库进行一次检査,删除里面的过期键。至于要删除多少过期键,以及要检査多少个数据库,则由算法决定。
通过上面的定义不难看出定时删除是每隔一段时间删除一部分的过期key,并不能保证过期key全部删除。这么做的好处是如果一段时间内存在大量的过期key,如果执行全部删除操作则会占用大量的cpu时间导致redis对外服务的吞吐量下降,因此只删除部分过期key来减少删除操作对CPU时间的影响。而惰性删除则是对定期删除的一种补充,如果用户查询的key已过期但并未被定期删除策略删除的情况下不至于返回用户过期的数据。
内存淘汰机制:
volatile-lru→当内存不足以容纳新写入数据时,在带有过期时间的key中删除最近最少使用的key
allkeys-lru→当内存不足以容纳新写入数据时,删除最近最少使用的key(推荐)
volatile-lfu→当内存不足以容纳新写入数据时,在带有过期时间的key中删除最少使用的key
allkeys-lfu→当内存不足以容纳新写入数据时,删除最少使用的key
volatile-random→当内存不足以容纳新写入数据时,在带有过期时间的key中随机删除key
allkeys-random→当内存不足以容纳新写入数据时,随机删除key
volatile-ttl→当内存不足以容纳新写入数据时,删除最近最少使用的key
noeviction→当内存不足以容纳新写入数据时,只在写操作时返回一个错误。(默认配置)
ps:
lru: 最近最少使用
lfu: 最不常用
版权声明: 本文为 InfoQ 作者【wjchenge】的原创文章。
原文链接:【http://xie.infoq.cn/article/af5f5df649d79fd6fec05b408】。文章转载请联系作者。
评论