后台线程都做什么
Redis 主体是单线程处理命令,但把一部分耗时且不需要立即返回的工作交给后台线程(bio):关闭大文件、AOF 的 fsync、以及开启 lazyfree 之后的异步内存释放。这些任务不阻塞主线程,收益是主线程响应更稳定;代价是任务积压时,内存回收与 fsync 落地会出现可见的延后。
基本信息
| 任务类型 | 关闭文件、AOF fsync、惰性释放内存 |
|---|---|
| 相关配置 | lazyfree 系列:user-del、expire、eviction、server-del |
| 观测方向 | 内存回落速度、延迟事件、持久化状态 |
| 设计取舍 | 用回收可见时间换取主线程低阻塞 |
| 积压表现 | 内存长时间不回落、fsync 明显延后 |
典型使用场景
- 大对象删除:单个键体积很大时,异步释放避免主线程长时间停顿
- 集中过期与淘汰:大量键同时释放时,异步化让主线程少停顿
- AOF 持久化:fsync 交给后台线程,避免每次写都等磁盘
- 延迟毛刺排查:确认毛刺是否来自同步释放路径,再决定是否开启
- 内存回落观察:删除后内存没立刻下降时,区分异步延后与未释放
查看与验证
查看与验证
redis-cli CONFIG GET lazyfree-lazy-user-del # 用户删除是否走异步
redis-cli CONFIG GET lazyfree-lazy-expire # 过期释放是否走异步
redis-cli INFO memory | grep used_memory_human # 删除后内存回落情况
redis-cli INFO persistence | grep -E 'aof_last_bgrewrite_status|rdb_last_bgsave_status'
redis-cli LATENCY LATEST # 延迟事件时间线配置与释放路径
| 配置 | 覆盖的释放路径 | 适用情况 |
|---|---|---|
| lazyfree-lazy-user-del | 客户端主动删除 | 大 value 缓存被主动清理时 |
| lazyfree-lazy-expire | 过期键释放 | 集中过期且对象较大时 |
| lazyfree-lazy-eviction | 内存淘汰 | 频繁淘汰大对象的实例 |
| lazyfree-lazy-server-del | 服务端内部删除 | 扩容、类型转换等内部路径 |
异步释放的收益是主线程停顿变短,代价是回收可见时间延后:删除命令返回成功但内存还没下降属于预期行为,不要把它当成没释放而重复触发删除。
后台任务积压时 fsync 会延后,持久化的时间窗口被拉长;对数据可靠性要求高的实例要同时看持久化状态,不能只看内存指标。