大家好,欢迎来到IT知识分享网。
应用场景:
127.0.0.1:6379> set a 11
OK
127.0.0.1:6379> set b 22
OK
127.0.0.1:6379> expire b 60
(integer) 1
127.0.0.1:6379> ttl a
(integer) -1
127.0.0.1:6379> ttl b
(integer) -2
IT知识分享网
上面操作了两个key,其中一个key设置了过期时间。当过了60秒,用TTL命令获取到不同的状态。这两个不同状态代表不同的意思。-1:代表永久有效的数据;-2:代表过期或删除的数据及未定义的数据。
我们开发一直都是这么用,但是很少有人去思考Redis是如何做到的。这就是Redis删除过期key的三种策略。
定时删除:创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作
当前时间和expires中对过期时间一致时,定时器触发删除
优点:节省内存,到时间就删除,快速释放不必要的内存占用。
缺点:CPU压力较大,无论CPU此时负载情况如何,均占用CPU来执行删除,会影响Redis服务器的响应时间和指令吞吐量。
惰性删除: 数据到达过期时间,不做处理,等下次访问该数据等时候执行删除
在获取数据时,Redis内部会确定数据是否到期。
未到期,返回数据。
到期,删除,返回不存在。
优点:节约cpu性能,到了必须删除的时候才执行删除。
缺点:内存压力较大,会出现长期占用内存的数据。
定期删除:Redis默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除
特点:对cpu的使用有峰值,也有一定的自定义空间。删除过程中,内存的压力也不是很大。
那么Redis采用的策略是:惰性删除+定期删除。采用Redis定时删除策略,如果并发很高的,那么CPU受不了。单单采用定期删除,可能存在还没有来得及删除又被访问,这个时候呢,惰性删除就出马了。
看上去Redis采用惰性删除+定期删除已经很完美了。但是并发很高,内存很快被耗尽。怎么办?这就是内存淘汰机制。内存淘汰机制采用哪种方式,这个可以根据实际项目在redis.conf中进行配置,默认为no-eviction方式。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/6125.html