首页/数据/Redis 进阶速查/lazyfree-lazy-expire:过期异步回收
内存与管理99 条

lazyfree-lazy-expire:过期异步回收

lazyfree-lazy-expire yes 让过期键的释放走后台线程,适合过期量大且对象较大的缓存场景。

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

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 已按逻辑大小减去,物理内存要等后台线程真正释放才下降,短窗口内不要据此判定异常。

易错点

  • 小对象为主时开启收益有限,缺少度量就全量打开,白增后台线程与统计复杂度
  • 开启后短时间内存不下降,被误报成内存泄漏
  • 只开异步释放不观察 lazyfree_pending_objects,排队积压时找不到症结
  • 只用 CONFIG SET 不开 CONFIG REWRITE,重启后配置悄悄回退

数据来源与参考

  • Redis 官方文档:惰性释放配置
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌