异步清库与主线程阻塞
FLUSHDB 与 FLUSHALL 支持 ASYNC 选项:加上它以后,命令立即返回,清空键空间后的内存释放交给后台线程慢慢完成;不带选项的默认行为是 SYNC,主线程同步释放,数据量大时会直接卡住数秒。ASYNC 适合缓存重建、测试环境清理这类可以接受「键已不可见、内存稍后释放」的场景。清库属于高风险操作,执行前必须确认实例身份、持久化关系以及是否存在副本。
基本信息
| 语法 | FLUSHDB [ASYNC|SYNC] |
|---|---|
| 还有 | FLUSHALL [ASYNC|SYNC] |
| 默认行为 | SYNC,主线程同步释放 |
| 引入版本 | ASYNC 自 Redis 4.0 起 |
| 生效范围 | 当前库 / 全部库 |
| 相关配置 | lazyfree-lazy-user-flush |
| 观测方式 | INFO keyspace 与内存回落曲线 |
典型使用场景
- 缓存整体重建前清空旧数据,同时希望业务请求不被阻塞
- 测试或预发环境清理数据,对内存回落时间不敏感
- 脚本化清库流程需要快速返回,避免命令超时
- 排查清库导致的延迟尖峰,用 ASYNC 对比验证
- 配合 UNLINK 与 lazyfree 开关,形成统一的异步释放策略
- 多环境批量初始化时降低单次操作的阻塞时长
执行与核对
执行与核对
redis-cli DBSIZE # 清库前记录规模
redis-cli INFO keyspace # 确认目标库有哪些
redis-cli FLUSHDB ASYNC # 清当前库,异步释放
redis-cli FLUSHALL ASYNC # 清全部库,异步释放
redis-cli CONFIG GET lazyfree-lazy-user-flush # 是否默认异步
redis-cli INFO keyspace # 返回时键已不可见
redis-cli INFO memory | grep used_memory # 内存稍后回落ASYNC 与 SYNC 对照
| 对比项 | SYNC(默认) | ASYNC |
|---|---|---|
| 返回时机 | 释放完成后返回 | 立即返回 |
| 主线程阻塞 | 数据量大时明显 | 基本消除 |
| 内存回落 | 随命令完成 | 滞后一段时间 |
| 适用场景 | 小数据集或可接受阻塞 | 大数据集、要求低阻塞 |
清库是破坏性操作:执行前用 INFO replication 与连接地址确认实例身份,避免在生产主库上误执行。
在副本上误执行 FLUSH 会清掉副本的数据,并可能引发重新同步,主从关系与业务读流量都会受影响。
ASYNC 执行后的一段时间里内存仍处于高占用,容量判断与告警别被这个时间差误导。