WAIT 解决什么问题
Redis 复制默认是异步的:主库写完就返回,从库可能还没收到。WAIT numreplicas timeout 让当前连接阻塞等待,直到指定数量的从库确认已收到此前所有写命令,返回实际确认的副本数。它是应用侧按需增强可靠性的手段,把「至少一个副本已收到」这件事变成可观测的返回值,而不是全局的同步复制开关。
基本信息
| 适用平台 | Redis 3.0+;语义与客户端阻塞行为有关 |
|---|---|
| 语法 | WAIT numreplicas timeout |
| timeout 单位 | 毫秒;0 表示无限等待 |
| 返回值 | 实际确认的从库数量 |
| 作用范围 | 当前连接在此之前发出的写命令 |
典型使用场景
- 关键订单写入后确认至少一个副本已收到,缩短故障丢失窗口
- 切换演练:验证拓扑中从库确认链路是否健康
- 把 WAIT 的返回值接入监控,观察副本确认能力的趋势
- 对可靠性要求分级的业务:核心写路径加 WAIT,非核心路径不加
- 排查复制健康度:返回值长期为 0 说明从库未及时确认
示例与返回值解读
示例与返回值解读
SET order:88 paid # 写入关键数据
WAIT 1 1000 # 等待至少 1 个从库确认,最多 1000 毫秒
# 返回 1 表示已有 1 个从库确认;返回 0 表示超时未确认
WAIT 2 500 # 期望 2 个副本确认,返回实际确认数
INFO replication | grep -E 'connected_slaves|slave_repl_offset'
# 监控建议:把 WAIT 返回值与超时次数一起采集,持续为 0 立刻告警参数与返回
| 项 | 含义 | 注意事项 |
|---|---|---|
| numreplicas | 期望确认的从库个数 | 设得比实际副本数大必然超时 |
| timeout | 毫秒上限,0 表示永久等待 | 0 在不健康拓扑下会挂住客户端 |
| 返回值 | 实际确认的从库数量 | 小于期望值即说明未达到可靠性目标 |
| 作用范围 | 本连接此前的写命令 | 与全局配置无关,仅影响当前连接 |
WAIT 能提升可靠性但不改变复制模型本身:它不阻止主库继续接受写入,也不保证从库已执行或落盘,只是让调用方知道有多少副本收到了数据。
超时时间为 0 表示无限等待:从库全部掉线时调用方会一直挂住,业务侧必须设置应用层的读超时并把它当成本次调用失败。