把释放工作挪到后台
删除一个大键时,释放它占用的内存可能非常耗时,主线程被卡住就表现为请求超时甚至连接超时。惰性释放把这项工作交给后台线程:主线程只负责把键从键空间里摘掉,内存回收在后台慢慢完成。相关开关覆盖淘汰、过期、内部删除、用户删除与清空库几条不同的触发路径,也可以直接用异步删除命令让某一次操作单独生效。
基本信息
| 解决对象 | 大键删除引起的主线程阻塞 |
|---|---|
| 机制 | 主线程摘除键,后台线程回收内存 |
| 开关族 | 淘汰、过期、内部删除、用户删除、清空库 |
| 单次使用 | 异步删除命令可在单次操作上生效 |
| 观察影响 | 内存回收存在延迟,指标会滞后 |
典型使用场景
- 延迟敏感业务出现周期性超时,定位到删除大键导致的阻塞
- 清空大实例的数据前评估是否需要异步方式,避免长时间卡顿
- 大批量键过期时出现的延迟毛刺,通过异步过期缓解
- 扩容或清理时删除容量很大的集合类型键
- 排查开启后内存为什么没有立刻下降,确认回收流程
查看与调整
查看与调整
redis-cli CONFIG GET lazyfree-* # 查看全部相关开关
redis-cli CONFIG SET lazyfree-lazy-user-del yes # 用户删除走后台回收
redis-cli CONFIG SET lazyfree-lazy-eviction yes # 淘汰时也使用异步释放
redis-cli UNLINK bigkey # 单次异步删除
redis-cli INFO memory | grep used_memory # 观察回收前后的变化开关与触发场景
| 开关 | 触发场景 | 说明 |
|---|---|---|
| 淘汰类 | 内存达到上限触发淘汰 | 避免淘汰大键时卡顿 |
| 过期类 | 键过期被清理 | 大批键集中过期时尤其有用 |
| 内部删除 | 实例自身的删除动作 | 常与内部维护操作相关 |
| 用户删除 | 客户端发起的删除命令 | 日常删除大键主要依赖它 |
| 清空库 | 清空整个数据库 | 大规模清理时收益最明显 |
开启之后内存回收是异步的,指标会出现滞后,短时间内看不到内存下降属于预期行为,不必急着怀疑配置没生效。
后台回收线程排队时,内存峰值仍可能顶到上限并触发额外淘汰,释放任务积压的场景要关注整体内存余量。