大家好,又见面了,我是你们的朋友全栈君。
redis可以对key的通用设置中,可以设置key的过期时间及ttl
如果单纯的再client中进行命令测试的话,会发现了当时间到时间后
再去获取该key会显示nil
那么一个key过期了,那么它实际是在什么时候删除的呢?
当然这个删除也不是简单的到期了就直接被删除了
redis中对于过期键的过期删除策略
它会在设置键的过期时间的同时,创建一个定时器, 当键到了过期时间,定时器会立即对键进行删除。 这个策略能够保证过期键的尽快删除,快速释放内存空间。
但是有得必有失,redis的操作频率是非常高的。绝大多数的键都是携带过期时间的,这样就会造成出现大量的定时器执行,严重降低系统性能
总的来说:该策略对内存来说十分的友好,但对cpu来说非常不友好,会拉低系统的性能,因此不建议使用
为了解决定时删除会占用大量CPU资源的问题, 因此产生了惰性删除。
它不持续关注key的过期时间, 而是在获取key时,才会检查key是否过期,如果过期则删除该key。简单来说就是:平时我不关注你,我用到你了,我才关注你在不在。
总的来说:惰性删除对CPU足够友好,但是对内存空间非常不友好,会造成大量内存空间的浪费。
定期删除,顾名思义,就是每隔一段时间进行一次删除
所以定时删除最关键的就在于执行时长和频率的设置
参数配置
默认每秒扫描10次,我们可以在redis的配置文件中进行更改
对于hz参数,官方不建议超过100,否则会把cpu造成比较大的压力
可以思考两个问题
有一些已经过期的key,定期扫描一直都没有扫描到它,而且这些key也一直没有被使用。 那么它们就会一直在内存中存在。同时继续向Redis不断插入新数据,最终造成内存空间不足的问题。
对于这种问题的解决,就用到了内存淘汰策略。
当客户端执行命令,添加数据时,Redis会检查内存空间大小,如超过最大内存,则触发内存淘汰策略。
在Redis中默认提供了三类八种淘汰策略。
这里我们可以看到两个名称:lru、lfu,他俩是什么意思呢?
他们的学名叫做:数据驱逐策略。 其实所谓的驱逐就是将数据从内存中删除掉。
redis默认使用noeviction,我们可以通过修改redis.conf中maxmemory-policy属性值设置不同的内存淘汰策略。
1、Redis只做缓存,不做DB持久化,使用allkeys。如状态性信息,经常被访问,但数据库不会修改。
2、同时用于缓存和DB持久化,使用volatile。如商品详情页。
3、存在冷热数据区分,则选择LRU或LFU。如热点新闻,热搜话题等。
4、每个key被访问概率基本相同,选择使用random。如企业内部系统,访问量不大,删除谁对数据库也造成太大压力。
5、根据超时时间长久淘汰数据,选择选用ttl。如微信过期好友请求。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127819.html原文链接:https://javaforall.cn
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有