redis键的过期删除策略

redis键的过期删除策略

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相关推荐
爱上语文20 分钟前
Redis基础(4):Set类型和SortedSet类型
java·数据库·redis·后端
lifallen34 分钟前
Paimon vs. HBase:全链路开销对比
java·大数据·数据结构·数据库·算法·flink·hbase
Brookty1 小时前
【MySQL】JDBC编程
java·数据库·后端·学习·mysql·jdbc
UQI-LIUWJ2 小时前
计算机组成笔记:缓存替换算法
笔记·缓存
先做个垃圾出来………2 小时前
SQL的底层逻辑解析
数据库·sql
码不停蹄的玄黓2 小时前
深入拆解MySQL InnoDB可重复读(RR)隔离级别:MVCC+临键锁如何「锁」住一致性?
数据库·mysql·可重复读
harmful_sheep3 小时前
Spring 为何需要三级缓存解决循环依赖,而不是二级缓存
java·spring·缓存
paopaokaka_luck3 小时前
基于SpringBoot+Vue的酒类仓储管理系统
数据库·vue.js·spring boot·后端·小程序
薛晓刚4 小时前
哪个领域数据库最难替换?
数据库
芷栀夏4 小时前
基于Anything LLM的本地知识库系统远程访问实现路径
数据库·人工智能