redis键的过期删除策略

redis键的过期删除策略

在redis中,所有的过期时间都保存在过期字典中,那么当一个键过期了,它什么时候会被删除呢?

这个问题有三种可能的答案,它们分别代表了三种不同的删除策略:

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

惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除键;如果没有过期,就返回该键。

定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。

定时删除应该在什么时候使用?

定时删除是内存友好的,定时器会尽快删除过期数据,并释放过期键所占用的内存。

但是,定时删除对CPU不友好,在过期键比较多的情况下,CPU资源会被大量占用。这无疑会对服务器的响应时间和吞吐量造成影响。

除此之外,实现定时器需要用到Redis服务器种的时间事件,而当前事件时间事件的实现方式是无序链表,查找时间事件的复杂度是O(N)。

因此,在数据量较大时,盲目使用定时删除会对系统造成极大负担,要慎重使用。除非数据占用内存较大。需要及时删除。

惰性删除应该在什么时候使用?

惰性删除对CPU友好而对内存不友好。如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要没有其他用户访问这个键,这个过期键不被删除,它所占用的内存就不会被释放。

举个例子,对于一些和时间有关的数据,比如日志,在某个时间点之后,对它们的访问量就会大大减少,甚至不再访问,如果这类过期数据大量地积压在数据库中,用户以为服务器已经自动将它们删除了,但实际上这些键仍然存在,而且键所占用的内存也没有释放,那么造成的后果肯定是非常严重的。

定期删除应该在什么时候使用?

定时删除占用太多CPU时间,影响服务器的响应时间和吞吐量。

惰性删除浪费太多内存,有内存泄漏的危险

定期删除是两种方法的折中:

定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响。

除此之外,通过定期删除过期键,定期删除策略有效地减少了因为过期键而带来的内存浪费。

定期删除策略的难点在于如何确定删除操作执行的时长和频率:

如果删除操作执行太频繁,或者执行的时间太长,定期删除策略就会退化成定时删除策略,以至于将CPU时间过多地消耗在删除过期键上面。

如果删除操作执行得太少,或者执行的时间太短,定期删除策略又会和惰性删除策略一样,出现浪费内存的情况。

相关推荐
NineData12 小时前
NineData智能数据管理平台新功能发布|2026年1-2月
数据库·sql·数据分析
IvorySQL13 小时前
双星闪耀温哥华:IvorySQL 社区两项议题入选 PGConf.dev 2026
数据库·postgresql·开源
ma_king16 小时前
入门 java 和 数据库
java·数据库·后端
jiayou6419 小时前
KingbaseES 实战:审计追踪配置与运维实践
数据库
NineData1 天前
NineData 迁移评估功能正式上线
数据库·dba
雨中飘荡的记忆1 天前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
NineData2 天前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师2 天前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
全栈老石2 天前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
曲幽2 天前
FastAPI分布式系统实战:拆解分布式系统中常见问题及解决方案
redis·python·fastapi·web·httpx·lock·asyncio