redis键的过期删除策略

redis键的过期删除策略

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相关推荐
焦糖布丁的午夜3 小时前
MySQL数据库大王小练习
数据库·mysql
狗头实习生4 小时前
Spring常见的事务失效原因
java·数据库·spring
冉冰学姐5 小时前
SSM泰兴市公交信息系统f504u(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架应用·泰兴市公交·息管理系统
偶像你挑的噻6 小时前
3.Qt-基础布局以及事件
开发语言·数据库·qt
Dxy12393102167 小时前
MySQL如何做读写分离架构
数据库·mysql·架构
may_一一7 小时前
docker安装的redis状态一直是restarting
java·redis·docker
毕设十刻8 小时前
基于Vue的考勤管理系统8n7j8(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
合方圆~小文8 小时前
不同画面,三个镜头实时监控拍摄方案
数据结构·数据库·人工智能
ChrisitineTX9 小时前
凌晨突发Java并发问题:synchronized锁升级导致接口超时,排查过程全记录
java·数据库·oracle
极限实验室9 小时前
Easysearch 2.0.0 性能测试
数据库·性能优化