Redis 如何删除过期数据?
未标记
考查重点:过期判定与清理时机。访问键时惰性检查过期,后台周期抽样清理;两者配合控制开销,过期键不保证到时立即物理删除
本题目录
参考答案
核心回答
Redis 将被动过期(惰性删除)和主动过期(定期删除)结合,在清理过期数据与控制 CPU 开销之间取平衡。
- 被动过期:访问某个键时检查过期时间。普通读取发现它已过期,就按不存在处理,并在相应路径触发删除。这样不必不停检查所有键,但一直不被访问的过期键可能继续占内存。
- 主动过期:周期性地从设置了过期时间的键中增量抽查,删除发现的过期键,并根据清理情况和时间预算决定是否继续。它负责清理那些没人再访问的键,不是每轮全库扫描。
因此,TTL 到期、键从键空间移除、对象内存释放,不一定发生在同一瞬间。主动和被动过期解决“什么时候发现并移除过期键”;同步删除或 lazy free 解决“对象内存由谁、何时释放”,这是两个不同维度。
为什么要组合两种机制?
只用惰性删除,冷数据即使早已过期,也可能因没人访问而长期占内存。只用定期抽查,清理又会受时间预算和抽样覆盖限制;如果访问路径不检查过期状态,在两次清理之间还可能读到已过期数据。
例如某个键设置为 60 秒后过期:到期后如果没人访问,主动清理会逐步发现它;如果它还没被主动清理就收到普通读取,被动检查会将它按不存在处理。Redis 无需为每个键单独安排一个到点必须运行的删除定时器。
过期时间以绝对时间记录,所以实例停机期间时间仍会流逝,系统时钟变化也会影响过期判断。这里的时间判断精度,不等于每个对象都能在到期那一毫秒完成物理回收。
主动过期怎样控制资源开销?
主动清理要避免长时间占用命令处理线程。它会分批处理带过期信息的键,限制每轮工作时间;过期键积压较多时增加清理力度,达到预算后把后续工作留到下一轮。
以 Redis 8.4 实现为例,主动过期有周期性慢循环和满足条件时的快循环,工作量受到 hz、动态频率和 active-expire-effort 等因素影响。调大清理力度,可以减少过期数据滞留,但也会消耗更多 CPU、影响响应延迟,不能把历史版本中的“固定每 100ms 抽 20 个”当成所有配置下的完整算法。
大量键集中到期时,过期检查、删除及缓存未命中后的回源都可能集中发生。可在业务允许的范围内分散 TTL、控制大对象规模,并结合延迟、CPU、内存和清理积压判断问题;分散时间不能突破数据必须失效的业务期限。
惰性删除和异步释放有什么区别?
惰性删除是访问时才发现过期,lazy free 是把较重的内存释放工作移到后台线程。 被动发现过期后仍可能同步释放;主动清理发现过期后,也可以走异步释放路径。
Redis 8.4 中,lazyfree-lazy-expire 控制过期删除是否采用延迟释放路径。满足异步释放条件的对象,先从键空间摘除,再交给后台回收;释放代价较小的对象仍可能直接同步释放。开启它不代表所有过期检查都转到后台,也不代表内存立即下降。
手动删除大对象时,UNLINK 同样把“键不可再访问”与后续内存回收分开;它并不是发现过期键的另一套扫描策略。即使使用异步释放,也需要关注后台回收是否积压,不能无限增加待释放对象。
常见追问
过期删除和内存淘汰是一回事吗? 不是。过期删除按 TTL 判断数据已失效;内存淘汰是在达到 maxmemory 等容量限制时,按配置的策略选择数据腾空间,可能移除还没到期的键。配置为 noeviction 时,容量压力下不会主动选择数据淘汰,而会拒绝相应写入;它不会关闭正常过期处理。
从节点也独立把所有过期键删掉吗? 常见主从复制中,主节点负责实际过期删除并向复制流、AOF 传播删除操作;从节点通常等待主节点传播,同时普通读取可以把逻辑过期键按不存在处理。提升为主节点后,它能根据已有过期信息主动清理,不能把“不独立删除”理解成“继续把过期值返回给用户”。
参考资料
- 国内:JavaGuide:Redis 常见面试题总结(上):过期数据删除小节说明主动与被动机制如何配合,以及为什么清理要限制频率和执行时间。
- 国内:advanced-java:Redis 的过期策略和 LRU 算法:依据过期数据仍占内存与容量淘汰的区别,说明正文中 TTL 清理和 maxmemory 触发不能混为同一种规则。
- 国内:小林 coding:Redis 过期删除策略和内存淘汰策略有什么区别?:三种清理思路的取舍及惰性检查部分,说明 Redis 为什么组合两种机制,以及发现过期与释放内存为何要分开。
- 国外:Redis:EXPIRE:依据过期时间、主动被动机制与复制的约定,说明正文中绝对时间判断、冷键清理及主从删除的分工。
- 国外:Redis:UNLINK:从键空间摘除与后台内存回收的接口约定,说明异步释放为何不同于访问时检查过期。
相关面经
12 篇启云方
AI 应用开发工程师Redis 过期键删除策略有哪些?
虎牙
全栈开发Redis 数据过期和淘汰策略
字节跳动
后端开发工程师Redis 的 key 过期之后,内存会立即释放吗?
去哪儿
AI 应用开发顺丰
后端开发工程师redis内存过期策略



