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 传播删除操作;从节点通常等待主节点传播,同时普通读取可以把逻辑过期键按不存在处理。提升为主节点后,它能根据已有过期信息主动清理,不能把“不独立删除”理解成“继续把过期值返回给用户”。

参考资料

相关面经

12 篇

启云方

AI 应用开发工程师
一面
查看原面经 →
Redis 过期键删除策略有哪些?

虎牙

全栈开发
校招秋招一面
查看原面经 →
Redis 数据过期和淘汰策略

字节跳动

后端开发工程师
一面
查看原面经 →
Redis 的 key 过期之后,内存会立即释放吗?

去哪儿

AI 应用开发
查看原面经 →
Redis的键过期删除机制是什么样的?如果只使用定期删除策略会有什么问题?
追问
追问:1)redis默认采用的哪几种过期删除策略来处理过期删除键的?

顺丰

后端开发工程师
一面
查看原面经 →
redis内存过期策略
展开剩余 7 篇面经

美团

后端开发工程师(AI)
校招秋招一面
查看原面经 →
过期删除策略

去哪儿

AI 应用开发工程师
秋招
查看原面经 →
Redis的键过期删除机制是什么样的?如果只使用定期删除策略会有什么问题?

美团

后端开发工程师
秋招一面
查看原面经 →
Redis 的 key 设置过期时间之后,Redis 采用什么策略删除过期 key,淘汰策略相关。

去哪儿

AI 全栈开发工程师
查看原面经 →
Redis的删除策略有哪些
你提到了惰性删除和直接删除,那么Redis的定义过期删除策略都有那些方案来平衡CPU和使用率。

滴滴

后端开发工程师
实习一面
查看原面经 →
Redis 的 Key 过期机制是怎样实现的?
追问
Redis 的惰性删除和定期删除分别是什么?

字节跳动

Agent 开发工程师(评测方向)
一面
查看原面经 →
Redis缓存过期策略和更新策略

阿里巴巴

后端开发工程师(AI)
实习一面
查看原面经 →
Redis的过期策略和内存淘汰机制了解吗?

相关题目

4 题