首页/数据/Redis 进阶速查/过期表的内存代价
内存与管理99 条

过期表的内存代价

每个带 TTL 的键都有一份过期时间记录,过期表与主字典独立维护;大量 TTL 键会带来可观的内存与 CPU 扫描成本。

Redis 进阶速查数据更新于 2026-10-13

过期表是什么

每个设置了生存时间的键,都会在过期字典里留一条记录:键的指针与到期时间戳。主字典负责取值,过期字典只负责记录「什么时候该删」。因此 TTL 不是零成本的元数据,键数量大时过期字典自身的内存占用与扫描成本都会显现出来。

基本信息

结构过期字典(expires dict),与主字典相互独立
每条记录键指针加到期时间戳
清理方式惰性删除(访问时判断)加定期抽样扫描
观测方式INFO keyspace 的 keys 与 expires 两列对照
影响面内存开销与扫描 CPU 开销,键越多越明显

两条清理路径

路径触发时机特点
惰性删除访问该键时判断是否过期精确但有延迟,冷键可能长期占内存
定期抽样扫描后台周期任务按过期键比例调整强度集中到期时 CPU 峰值明显
主动清理强度由 hz 与 active-expire-effort 这类参数影响提高强度加快回收但增加 CPU 负担
观测口径expired_keys 为累计回收计数单点值说明规模,趋势要看差分

查看与核对

查看与核对
redis-cli INFO keyspace                      # 每个库的 keys 与 expires 数量
redis-cli DBSIZE
redis-cli INFO stats | grep expired_keys     # 累计过期回收计数
redis-cli TTL some:key                       # 确认单个键的剩余生存时间
redis-cli --scan --pattern 'sess:*' | head -20   # 抽查键命名与 TTL 规范是否一致

典型使用场景

  • 会话类数据:按会话维度设 TTL,评估会话总量对内存的影响
  • 容量估算:用 expires 占比修正内存预算,避免只算数据本身
  • 抖动排查:大量键集中到期时观察回收压力与延迟尖刺
  • 清理规范核对:抽查键命名与 TTL 是否成对,防止漏设或漏删
  • 淘汰策略配套:选择 volatile 系列策略时,确认确实有足量带 TTL 的键
过期扫描是抽样式的,TTL 在时间上越分散,键越容易被及时回收;同一时刻集中到期的海量键会造成回收压力,给 TTL 加随机抖动是常用做法。
过期键的回收会占用主线程,删除大对象时可能看到延迟尖刺;可在评估后使用异步释放相关选项(如 lazyfree-lazy-expire),改动前先在测试环境验证。

易错点

  • 把 TTL 当零成本元数据,键数量上亿时过期字典的开销相当可观
  • 同一秒集中到期的海量键引发回收压力与延迟抖动,TTL 没有加随机抖动
  • 用 TTL 代替业务清理,冷键长期不被访问,惰性删除迟迟不发生
  • 只看 keys 数量不看 expires 比例,内存估算与实际偏差很大
  • 期望批量过期键立即释放内存,忽略删除在主线程分次进行,缺少尖刺预案

数据来源与参考

  • Redis 官方文档:过期机制内部实现说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌