讨论一下redis的过期键删除机制

近来重新复习了一下redis,对redis的理解又深入一层。

百度谷歌上搜到资料有一些压根是错的,但是却被放在了搜索结果前几个,感觉无奈无爱! (当然我也不保证我的是全对的,毕竟不同角度有不同的看法)

参考资料书籍:Redis设计与实现 出版社:机械工业出版社。P107 ~ P111

问题:如果一个键过期了,那么它什么时候会被删除呢?有三个答案

定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在过期时间来临时,立即执行对键的删除操作 .。

这种过期策略对内存友好,但对CPU是非常不友好的。因为还要主动设定定时器并主动删除,即通过CPU换内存(CPU主动删除了内存中的数据嘛,CPU忙,内存空闲)。可以想象一下在大数据大并发的时候,这种机制是多么灾难

惰性删除(Lazy Expiration):redis内部不会监视记录是否过期,但是每次从键空间获取键时,检查记录是否过期。这种技术被称为lazy(惰性)expiration。

与定时删除相反,此删除机制对内存是不友好的对CPU是友好的,惰性删除不会主动去删除已到期(expire)的键,而是等有需要调用的时候再判断,即内存换CPU(内存中有大量残留数据)

定期删除:每隔一段时间,对redis数据库进行一次检查,删除里面的过期键

属于前两种方法的折中.但要注意操作检查执行的时间和频率,如果删除操作做的太频繁,或者检查执行的时间太长,定期策略就会退化成定时策略。

如果检查执行的频率太少或者检查执行的时间太少,就会变成和惰性策略一样。

Redis服务器实际使用的是惰性删除和定期删除策略两种策略,配合使用两种策略和在使用CPU和内存找到平衡点。

惰性删除为redis服务器内置策略,定期删除在redis.conf 的hz选项,默认为10 (即1秒执行10次,100ms一次)

    原文作者:大菌说事
    原文地址: https://segmentfault.com/a/1190000004866645
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞