lazyfree-lazy-expire 是什么
lazyfree-lazy-expire 是 Redis 4.0 引入的配置项,默认 no。开启后,过期键的内存释放交给后台线程完成,而不是在事件循环里同步释放。它针对的是「单个对象特别大、恰好到期」这类会卡住主线程的场景。
基本信息
| 配置项 | lazyfree-lazy-expire |
|---|---|
| 默认值 | no |
| 生效方式 | CONFIG SET 运行时生效,写入 redis.conf 才持久 |
| 同族开关 | lazyfree-lazy-eviction / lazyfree-lazy-server-del / lazyfree-lazy-user-del |
| 观测字段 | INFO stats 中的 lazyfree_pending_objects / lazyfreed_objects |
典型使用场景
- 大 value 缓存集中过期时出现规律性延迟毛刺
- 主从架构下希望减少过期释放对主线程的占用
- 集合类大键(元素很多)到期时观察到阻塞
- 压测暴露到期抖动后,逐项验证异步释放能否缓解
- 批量导入的短期数据设置了 TTL,到期时刻需要平稳
开启与验证
开启与验证
redis-cli CONFIG GET lazyfree-lazy-* # 先看四个开关当前状态
redis-cli CONFIG SET lazyfree-lazy-expire yes # 运行时开启,重启后失效
redis-cli CONFIG REWRITE # 需要持久化时写回 redis.conf
redis-cli INFO stats | grep lazyfree # 关注 pending 与 freed 计数
redis-cli LATENCY RESET # 对比前后延迟:先清空采样
redis-cli LATENCY DOCTOR四个 lazyfree 开关分工
| 开关 | 管哪条删除路径 | 主要收益 |
|---|---|---|
| lazyfree-lazy-expire | 过期删除 | 大对象集中到期不卡主线程 |
| lazyfree-lazy-eviction | 达到 maxmemory 时的淘汰 | 淘汰大键时减少阻塞 |
| lazyfree-lazy-server-del | 服务端内部删除(覆盖、类型转换等) | 削掉难以归因的隐性释放停顿 |
| lazyfree-lazy-user-del | 客户端显式删除(6.2 起支持 DEL) | 让显式删除也走异步 |
过期清理本身是抽样分散执行的,多数场景下到期不会造成明显停顿;异步化的主要收益来自单键体积特别大的对象。开启后 used_memory 的下降会更平缓,这是异步释放的正常滞后。
验证是否真的生效
- 先 CONFIG GET 确认开关值为 yes,避免改了没生效
- 用 INFO stats 观察 lazyfree_pending_objects 是否出现非零值
- 用 LATENCY LATEST 对比开启前后同名事件的峰值变化
- 在压测环境用相同键分布复现,排除业务波动干扰
- 把版本、实例规格与观测窗口一并写进变更记录
开启异步释放后,内存指标会出现轻微错位:used_memory 已按逻辑大小减去,物理内存要等后台线程真正释放才下降,短窗口内不要据此判定异常。