*Redis WAITAOF 命令

WAITAOF 阻塞当前客户端,直到该客户端之前的所有写命令被确认已 fsync 到本地 AOF 和/或指定数量的副本的 AOF 中。


*语法

WAITAOF numlocal numreplicas timeout

*参数说明

参数 类型 必填 说明
numlocal Integer 需要确认的本地 fsync 数量。1 表示等待本地 AOF 持久化,0 表示禁用本地检查
numreplicas Integer 需要确认的副本 fsync 数量。0 表示不等待副本
timeout Integer 超时时间(毫秒)。0 表示永久阻塞

*返回值

  • Array [localcount, replicacount]:两个整数的数组
    • 第一个整数:本地 Redis 已 fsync 的数量(0 或 1)
    • 第二个整数:已确认 fsync 的副本数量

*时间复杂度

O(1)

*

*示例

*等待本地 AOF 持久化

> SET foo bar
OK
> WAITAOF 1 0 0
1) (integer) 1
2) (integer) 0

*等待副本确认(带超时)

> SET foo bar
OK
> WAITAOF 0 1 1000
1) (integer) 1
2) (integer) 0

*同时等待本地和副本

> SET foo bar
OK
> WAITAOF 1 2 5000
1) (integer) 1
2) (integer) 2

*常见错误

错误 原因 解决
ERR WAITAOF cannot be used in a replica 在副本实例上执行 在 master 实例上执行
ERR numlocal can't be non-zero when AOF is off 本地 AOF 未启用但 numlocal > 0 启用 AOF 或设置 numlocal 为 0
ERR timeout is not an integer or out of range timeout 格式错误 确保 timeout 是有效的整数

*最佳实践

  • 需要强数据持久化保证时,在关键写操作后调用 WAITAOF 1 0 timeout
  • 跨机房复制场景使用 WAITAOF 0 1 timeout 等待副本确认
  • 生产环境务必设置合理的 timeout,避免客户端永久阻塞
  • MULTI 事务或脚本中调用时不阻塞,立即返回当前已确认数量
  • 返回值需与要求的持久化级别比较,确认满足需求

*FAQ

Q1: WAITAOF 和 WAIT 有什么区别? A: WAIT 等待副本确认收到数据(复制偏移量),WAITAOF 等待副本将数据 fsync 到 AOF 文件。WAITAOF 提供更强的持久化保证。

Q2: WAITAOF 能使 Redis 成为强一致性存储吗? A: 不能。WAITAOF 提高数据安全性,但在故障转移或重启时仍可能丢失数据,除非等待集群所有成员 fsync。

Q3: timeout 为 0 会有什么效果? A: timeout 为 0 表示永久阻塞,直到满足 numlocal 和 numreplicas 的要求。生产环境应谨慎使用。

Q4: 在脚本或事务中执行 WAITAOF 会阻塞吗? A: 不会。在 MULTI 事务或 Lua 脚本中,WAITAOF 立即返回当前已确认的数量,不会阻塞。

Q5: WAITAOF 可以和模块/Lua 的自定义复制一起使用吗? A: 不建议。如果模块或 Lua 脚本使用 RedisModuleCall 或 redis.setrepl 只传播到 AOF 而不传播到复制流,可能与 WAITAOF 产生不兼容行为。