过期删除策略是什么
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 | 键存在但没有设置过期时间 | 永不过期的键长期占内存 |
| 正数 | 剩余过期秒数 | 接近零时要留意集中过期 |
| 带过期键数量 | 设置了过期时间的键总数 | 占比过低说明清理策略缺失 |
定期删除是抽样进行的:键越多,单轮能覆盖到的比例越低,因此大量过期键的清理需要多个周期才能完成。
大量键在同一秒到期会形成删除尖峰:给过期时间加随机抖动,是避免缓存集中失效的标准做法。