777 字
4 分钟
Redis 的过期 Key 是如何被删除的?
  1. 1Redis 系列导读:知识地图、必会主线与复习顺序
  2. 2Redis 中常见的数据类型有哪些?
  3. 3Redis 通常应用于哪些场景?
  4. 4Redis为什么这么快?
  5. 5Redis 常用的过期时间、删除 Key 命令有哪些?
  6. 6Redis 的过期 Key 是如何被删除的?本文
  7. 7Redis 内存满了怎么办?有哪些淘汰策略?
  8. 8缓存穿透、击穿、雪崩的区别与解决方案
  9. 9Redis 如何保证缓存与数据库的数据一致性?
  10. 10Redis 的持久化机制有哪些?
  11. 11Redis 主从复制的完整流程是什么?
  12. 12Redis 的哨兵机制是什么?
  13. 13Redis Cluster 模式与 Sentinel 模式的区别是什么?
  14. 14Redis 支持事务吗?如何实现?
  15. 15Redis 中如何实现分布式锁?
  16. 16Redis 的 Lua 脚本功能是什么?如何使用?
  17. 17如何解决 Redis 中的热点 Key 问题?
  18. 18Redis BigKey 有什么危害?如何发现和治理?
  19. 19为什么 Redis 设计为单线程?6.0 版本为何引入多线程?
  20. 20Redis 的 LRU 和 LFU 有什么区别?
  21. 21Redis 数据类型和底层编码有什么区别?
  22. 22Redis 中跳表的实现原理是什么?
  23. 23Redis 的 ZSet 为什么使用跳表,而不是平衡树?
  24. 24Redis 的 RDB 快照如何生成?为什么会有写时复制?
  25. 25Redis 的 AOF 刷盘和重写有什么区别?
  26. 26Redis 断线后如何通过 PSYNC 部分重同步?
  27. 27Redis 主从切换为什么会丢数据?WAIT 能解决吗?
  28. 28Redis 集群会出现脑裂问题吗?
  29. 29Redisson 看门狗(watch dog)机制了解吗?
  30. 30Redis Cluster:哈希槽、Gossip 与故障转移
  31. 31Redis Pipeline 为什么能提高吞吐?能保证原子性吗?
  32. 32Redis 的 SCAN 和 KEYS 有什么区别?
  33. 33Redis 变慢时如何排查?SLOWLOG 能看到所有耗时吗?
  34. 34Redis 和 MySQL 有什么区别?
  35. 35Redis 为什么使用 SDS,而不是 C 字符串?
  36. 36Redis 的哈希表如何处理冲突和渐进式 rehash?
  37. 37Redis Cluster 的 MOVED 和 ASK 重定向有什么区别?
  38. 38Redis Cluster 为什么会报 CROSSSLOT?Hash Tag 怎么用?
  39. 39Redis 如何实现限流?固定窗口和滑动窗口怎么选?
  40. 40Redis Stream 如何保证消息消费?ACK 和 PEL 是什么?
  41. 41Redis 删除数据后为什么内存不下降?如何理解内存碎片?

Redis 的 Key 到期后,不一定在到期瞬间就完成内存回收。Redis 主要结合访问时检查的惰性删除与后台周期性执行的主动过期,兼顾请求延迟和内存使用。这里讨论 Redis OSS 的常见机制,具体扫描预算和配置应以运行版本为准。

两种策略怎样配合?#

惰性删除发生在访问 Key 时。若 Redis 发现它已过期,就按不存在处理并删除,而不是把过期值返回给正常读取请求。这种方式不会为每个 Key 创建独立定时器,但从此无人访问的过期 Key 可能暂时留在内存。

主动过期则定期检查带过期时间的 Key,清理其中已经到期的部分。它有时间预算,避免一次扫描所有 Key 把主线程占满。过期比例较高时可以继续清理,但仍需要在释放内存和服务请求之间做权衡。不能理解为“每隔固定时间检查所有 Key”。

假设一批商品缓存同时到期:访问中的 Key 可由惰性检查清理,无人访问的部分由主动过期逐步回收;如果全部同时失效,数据库仍可能遭遇雪崩。删除策略负责过期数据清理,业务还应给 TTL 加随机量、控制缓存重建并发。

过期和淘汰有什么区别?#

机制触发原因是否可能删除没到期的数据
过期删除到达 Key 的过期时间按 TTL 判断
内存淘汰超过 maxmemory 且执行相应策略可以

Key 设置了一小时 TTL,并不意味着它一定能存活一小时;采用 allkeys 淘汰策略时,它可能提前被淘汰。反过来,没有 TTL 的 Key 也可能被 allkeys 策略删除。

常见追问#

到期但还没回收,GET 会返回旧数据吗?#

普通主节点读取会检查过期并按不存在处理。逻辑上不可见和物理内存释放是两件事;副本读取与复制状态等边界需要另行考虑,不能把物理残留当成业务可读保证。

为什么不用精确的定时删除?#

为海量 Key 维护定时任务有管理成本,大量同时到期还会集中消耗 CPU。惰性和主动检查让清理工作分摊到访问与后台执行。

它们是主动删除命令,不能替代自动过期机制。UNLINK 将 Key 从键空间摘除,并把适合异步释放的工作交给后台;小对象释放未必总交给后台。对大对象的删除延迟应实测。

TTL 到期通知能作为可靠的定时任务吗?#

不能。键空间通知不是可靠消息队列,事件产生时间也受实际过期清理时机影响。订单超时等业务需要可恢复的调度或消息机制。

Redis 的过期 Key 是如何被删除的?
https://blog.xqcherry.top/posts/interview/redis/redis-expiration-strategies/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0