过期策略
定时过期
为每个设置了
ttl属性的key设置一个定时器,到期立即删除,能很快回收内存,但是对cpu的资源消耗也会提高,在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分CPU时间,在内存不紧张但是CPU时间非常紧张的情况下,将CPU时间用在删除和当前任务无关的过期键上,无疑会对服务器的响应时间和吞吐量造成影响
惰性过期
访问一个key时判断该 key 是否已过期,过期则清除,减少cpu资源的消耗,但可能会产生大量过期的key没被删除
定时清理
每隔一段时间,清除一定数量过期的key,定期删除策略的难点是确定删除操作执行的时长和频率,如果删除操作执行得太频繁,或者执行的时间太长,定期删除策略就会退化成定时删除策略,以至于将CPU时间过多地消耗在删除过期键上面。如果删除操作执行得太少,或者执行的时间太短,定期删除策略又会和惰性删除策略一样,出现浪费内存的情况。
redis中采用的过期策略
惰性过期
定时清理
过期键的定期删除策略由redis.c/activeExpireCycle函数实现,每当Redis的服务器周期性操作redis.c/serverCron函数执行时,activeExpireCycle函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键。
定时清理流程图
参考文献
blog.csdn.net/weixin_4468… www.54manong.com/ebook/大数据/2…
补充说明
为什么写这篇文章,还是因为参考别人的博客和源码总感觉好像不太对,个人对c语言也不太了解,不能确定准确性,所以写出来让各位大佬给指正一下,这里参考的源码是redis设计与实现作者写的包含详细中文注释的源码 github.com/huangz1990/…