过期键的回收节奏
过期键的内存释放有两条路径:被动删除发生在客户端访问到该键时,发现已过期就立即删除;主动删除由定时任务周期性抽样检查并清理。定时任务的执行频率受 hz 控制(默认 10),开启 dynamic-hz 后 Redis 会在连接数较多时自动提高频率。如果过期键很多而回收跟不上,内存与 CPU 都会被持续占用,典型现象是「数据按 TTL 早该过期了,内存却迟迟不降」。
基本信息
| 被动路径 | 访问时发现过期即删 |
|---|---|
| 主动路径 | 周期抽样扫描删除 |
| 定时频率 | hz,默认 10 |
| 动态调整 | dynamic-hz 默认开启 |
| 回收统计 | INFO stats 的 expired_keys |
| 库级视图 | INFO keyspace 的 expires 与 avg_ttl |
| 力度参数 | active-expire-effort(支持版本可调) |
典型使用场景
- 内存回落缓慢,确认过期键是否堆积未被及时清理
- 集中设置同一时间点过期,评估过期潮对 CPU 的冲击
- 排查「键明明过期还占着内存」的疑问,理解两条删除路径
- 为缓存设计 TTL 时加入随机抖动,分散过期压力
- 调整定时任务节奏前,评估对整体延迟与吞吐的影响
- 核对 keyspace 的过期键数量占比,识别过期策略设计问题
查看与调整
查看与调整
redis-cli INFO stats | grep -E 'expired_keys' # 累计过期回收量
redis-cli INFO keyspace # 各库键数、过期键数与平均 TTL
redis-cli CONFIG GET hz # 定时任务频率
redis-cli CONFIG GET dynamic-hz # 是否动态调整
redis-cli CONFIG GET active-expire-effort # 主动过期努力程度
redis-cli INFO cpu # 过期回收对 CPU 的影响两条回收路径对照
| 路径 | 触发条件 | 特点 |
|---|---|---|
| 被动删除 | 客户端访问该键 | 及时但依赖访问 |
| 主动删除 | 定时任务周期抽样 | 覆盖冷键,消耗 CPU |
| 集中过期 | 大量键同一时刻到期 | 瞬间压力集中,需抖动分散 |
过期键多但内存回落慢时,先确认主动抽样是否被高负载拖慢,而不是急着做全库扫描。
TTL 上加随机抖动是把过期潮摊平的最简单手段:同一批缓存错开几十秒到几分钟,CPU 曲线会平滑很多。