*Redis waitaof 命令

*语法

WAITAOF numlocal numreplicas timeout

此命令阻塞当前客户端,直到该客户端的所有先前写命令被确认为已 fsync 到本地 Redis 的 AOF 和/或至少指定数量的副本。

numlocal 表示在继续之前需要确认的本地 fsync 数量。 当 numlocal 设置为 1 时,命令阻塞直到写入 Redis 实例的数据被确认为已持久化到本地 AOF 文件。 值 0 禁用此检查。

如果达到指定的超时时间(以毫秒为单位),即使尚未达到指定的确认数量,命令也会返回。

该命令始终返回WAITAOF 命令之前当前客户端发送的所有写命令已 fsync 到 AOF 的主节点和副本数量,无论是否达到指定的阈值,还是超时已到达。

几点说明:

  1. WAITAOF 返回时,保证当前连接上下文中发送的所有先前写命令已 fsync 到至少由 WAITAOF 返回数量的主节点和副本的 AOF。
  2. 如果命令作为 MULTI 事务的一部分发送(或任何其他不允许阻塞的上下文,例如在脚本内部),命令不会阻塞,而是立即返回已 fsync 所有先前写命令的主节点和副本数量。
  3. 超时 0 表示永久阻塞。
  4. 由于 WAITAOF 在成功和超时情况下都返回已完成的 fsync 数量,客户端应检查返回值是否等于或大于所需的持久化级别。
  5. WAITAOF 不能在副本实例上使用,如果本地 Redis 未启用 AOF,则 numlocal 参数不能为非零。

*限制

可以编写模块或 Lua 脚本将写操作传播到 AOF 但不传播到复制流。 (对于模块,这是通过 RedisModule_CallRedisModule_Replicatefmt 参数完成的;对于 Lua 脚本,这是通过 redis.set_repl 实现的。)

这些功能与当前实现的 WAITAOF 命令不兼容,组合使用可能导致不正确的行为。

*一致性与 WAITAOF

注意,与 WAIT 类似,WAITAOF 不会使 Redis 成为强一致性存储。 除非等待集群的所有成员将写操作 fsync 到磁盘,否则在故障转移或 Redis 重启期间仍可能丢失数据。 然而,WAITAOF 确实提高了实际的数据安全性。

*实现细节

自 Redis 7.2 起,即使没有配置副本,Redis 也会跟踪并递增复制偏移量(只要存在 AOF)。

此外,Redis 副本会异步 ping 它们的主节点,并携带两个复制偏移量:它们在复制流中已处理的偏移量,以及它们已 fsync 到 AOF 的偏移量。

Redis 为每个客户端记住,当在该客户端上下文中执行最后一个写命令时,生成的复制流的复制偏移量。 当调用 WAITAOF 时,Redis 检查本地 Redis 和/或指定数量的副本是否已确认将此偏移量或更大的偏移量 fsync 到其 AOF。

*示例

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

在上面的示例中,第一次调用 WAITAOF 不使用超时,并要求将写操作 fsync 到本地 Redis 仅;当完成时返回 [1, 0]。

在第二次尝试中,我们指定了超时,并要求单个副本确认写操作已 fsync。 由于没有连接的副本,WAITAOF 命令在一秒后解除阻塞,并再次返回 [1, 0],指示写操作已在本地 Redis 上 fsync,但没有副本。

*返回信息