redis键的过期删除策略

redis键的过期删除策略

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相关推荐
腾讯云开发者7 分钟前
与数据库打了几十年交道,WorkBuddy让我有了「第二知识库」
数据库
星云API技术支持17 分钟前
企业微信二次开发机器人:实时消息回调与历史消息同步如何配合
数据库·机器人·企业微信
Aolith29 分钟前
我在React全栈项目中搭建了一个完整题库
数据库·react.js·全栈
雨辰AI1 小时前
信创数仓分层建模|国产数据库 ODS/DWD/DWS 分层落地规范(金仓 / 达梦 / 高斯适配)
数据库·云原生·政务
风哥2号2 小时前
MySQL8.x/9.x数据库安装自动化全过程-Fgedu
数据库·mysql自动化安装
疯狂打码的少年2 小时前
【数据库技术】SQL数据查询(SELECT基本语法)
数据库·笔记·sql·oracle
程序员黎剑2 小时前
Redis缓存击穿:热点Key过期打崩数据库的3种解决方案
数据库·redis·缓存
Carl_.Net软开2 小时前
NSSM后台启动influx时序数据库
数据库·时序数据库
IPdodo_3 小时前
静态 IP 访问异常排查:403/429 归因与迁移验收
服务器·网络·数据库·python·网络协议·php·性能测试
DevOpenClub3 小时前
PDF 多格式解析如何避免混用输出:TEXT、HTML、XML 与 TAG 数据契约
xml·前端·数据库·pdf·html