redis键的过期删除策略

redis键的过期删除策略

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相关推荐
ITxiaobing2023几秒前
IP 库与 AppsFlyer 国家/地区数据不一致,如何系统地对账?
数据库·网络协议·tcp/ip
.Bryce.5 分钟前
在智能体中使用A2A工具:让大模型自己决定“该找谁帮忙“
android·java·服务器·redis·后端·agent·a2a
这个DBA有点耶10 分钟前
从时间到语义:时序数据库与向量数据库的核心机制、选型与多模融合趋势
数据库·mysql·架构
对空六课31 分钟前
RFM分层边界变化的回溯计算
大数据·服务器·前端·数据库·人工智能·算法·数据分析
小羊没烦恼!35 分钟前
如何在IIS6,7中部署ASP.NET网站?
数据库·后端·python·web安全·asp.net
CableTech_SQH1 小时前
行业运维新标杆:百盛3D全场景运维系统
运维·数据库·信息与通信·综合布线
ITOM运维行者1 小时前
WAN监控怎么做?从链路质量指标到路径级定位的完整方法
数据库·人工智能·机器学习
太理摆烂哥2 小时前
MySQL库的操作
数据库·mysql
Dreamboat-L2 小时前
日志级别基础 + Spring Boot 日志实践指南
java·服务器·数据库·java-ee·springboot
野生数据人2 小时前
ES DSL 转 SQL 速查表:20 条子句对照 + 一条能直接跑的改写示例
大数据·数据库