首页/数据/数据库速查/过期删除策略(惰性 + 定期)与内存滞留
Redis 运维与场景124 条

过期删除策略(惰性 + 定期)与内存滞留

Redis 不实时删除到期键:访问时惰性删除 + 每秒若干次定期抽样删除;因此过期键可能短期滞留内存(从库更特殊:等主库 DEL)。

数据库速查数据更新于 2026-10-13

过期删除策略是什么

Redis 不会在键到期的瞬间立刻删掉它,而是两条路径配合:访问到该键时惰性删除,加上每秒若干次抽样检查的定期删除。因此过期键可能在一段时间内仍占着内存。从库更特殊,它不自行删除过期键,要等主库发来删除命令,所以从库内存会与主库保持一致。

基本信息

惰性删除读写键时检查是否到期,到期就删除并返回空
定期删除由 hz 参数控制检查频率,默认 10 次每秒
从库行为不主动删除过期键,依赖主库下发的删除命令
统计口径过期键数量与平均存活时间可在键空间信息中查看
内存影响滞留的过期键仍占内存,极端情况会干扰使用率判断

典型使用场景

  • 缓存容量评估:只看到期键数量不够,要结合实际内存占用判断
  • 集中过期治理:大量键同一时刻到期会让删除与访问同时变慢
  • 内存不释放排查:确认是过期滞留还是根本没有设置过期时间
  • 从库内存核对:从库内存应与主库接近,差异大要查复制是否正常
  • 键空间巡检:定期统计设置了过期时间的键占比,避免全量永不过期

观察与治理

观察与治理
redis-cli INFO keyspace                     # 各库键数量与带过期时间的键数量
redis-cli INFO keyspace | grep -E "expires|avg_ttl"    # 带过期键数量与平均存活时间
redis-cli SET k v EX 10                     # 构造一个 10 秒后过期的键
sleep 10
redis-cli TTL k                             # 返回 -2 表示键已不存在
redis-cli TTL persistent:key                # 返回 -1 表示键存在但没有过期时间
redis-cli CONFIG GET hz                     # 定期删除频率,默认 10
# 给缓存键的过期时间加随机抖动,避免同一时刻集中过期
# TTL = 基准秒数 + 随机偏移

输出逐列读法

返回含义注意
-2键不存在(已过期或被删除)不能与「没有过期时间」混淆
-1键存在但没有设置过期时间永不过期的键长期占内存
正数剩余过期秒数接近零时要留意集中过期
带过期键数量设置了过期时间的键总数占比过低说明清理策略缺失
定期删除是抽样进行的:键越多,单轮能覆盖到的比例越低,因此大量过期键的清理需要多个周期才能完成。
大量键在同一秒到期会形成删除尖峰:给过期时间加随机抖动,是避免缓存集中失效的标准做法。

易错点

  • 以为到期内存立刻归零:惰性与定期结合的机制存在滞留窗口
  • 把不存在与永不过期混淆:两者的返回值不同,判断错会导致逻辑跑偏
  • 不给缓存键设置过期时间:内存只增不减,最终触发淘汰或写入失败
  • 过度提高定期删除频率:清理变快但 CPU 消耗上升,需要权衡

数据来源与参考

  • Redis 官方文档: 过期时间
  • Redis 官方文档: hz

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌