WAIT numreplicas timeout

Redis WAIT 命令用来阻塞当前客户端,直到所有先前的写入命令成功传输并且至少由指定数量的从节点复制完成。如果执行超过超时时间(以毫秒为单位),则即使尚未完成指定数量的从结点复制,该命令也会返回。

WAIT 命令总是返回WAIT 命令之前发送的写入命令被复制到的从结点数量。

几点说明:

  1. WAIT 返回时,在当前连接的上下文中发送的所有先前的写入命令被保证由 WAIT 返回的数量的从结点接收。
  2. 如果该命令是作为 MULTI 事务的一部分发送的,则该命令不会阻塞,而是仅返回 ASAP 确认上一个 WAIT 命令写入从结点的数量。
  3. 超时时间 0 意味着永久阻止。
  4. 由于 WAIT 返回在失败和成功时都达到的从结点数量,客户端应检查返回的值是否等于或大于它所要求的复制数量。

*语法

redis WAIT 命令基本语法如下:

redis 127.0.0.1:6379> WAIT numreplicas timeout

*一致性和 WAIT

请注意,WAIT 不会使 Redis 成为强一致性的存储:虽然同步复制是复制状态机的一部分,但它不是唯一需要的。但是,在 Sentinel 或 Redis 群集故障转移的情况下,WAIT 可以提高现实世界的数据安全性。

具体而言,如果给定的写入被传输到一个或多个从属设备,则更有可能(但不能保证),如果主设备出现故障,我们将能够在故障转移期间提升接收写入的从设备:Sentinel 和 Redis Cluster 将尽最大努力尝试在可用的从结点集合中提升最佳的从节点。

但是,这只是尽力而为的尝试,所以仍然可能会丢失同步复制到多个从服务器的写入。

*实现细节

Since the introduction of partial resynchronization with replicas (PSYNC feature) Redis replicas asynchronously ping their master with the offset they already processed in the replication stream. This is used in multiple ways:

  1. Detect timed out replicas.
  2. Perform a partial resynchronization after a disconnection.
  3. Implement WAIT.

In the specific case of the implementation of WAIT, Redis remembers, for each client, the replication offset of the produced replication stream when a given write command was executed in the context of a given client. When WAIT is called Redis checks if the specified number of replicas already acknowledged this offset or a greater one.

*返回值

整数: 接收写操作的从结点数量。

*例子

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

在上面的例子中,首次调用 WAIT 时不使用超时,并要求写入达到1个从结点。它返回成功。在第二次尝试中,设置了一个超时,并要求将写入复制到两个从节点。由于只有一个可用的从结点,所以在 WAIT 在等待 1 秒后解除阻塞并返回 1,表示完成复制的从结点数量。