wait

WAIT

WAIT numslaves timeout

自3.0.0起可用。

时间复杂度: O(1)

该命令将阻止当前客户端,直到所有先前的写入命令成功传输并且至少由指定数量的从站确认。如果达到超时(以毫秒为单位),则即使尚未达到指定数量的从站,该命令也会返回。

在达到指定数量的从站或达到超时时,该命令将始终返回确认在WAIT命令之前发送的写入命令的从站数量。

几句话:

  • 当 WAIT 返回时,在当前连接的上下文中发送的所有先前的写入命令被保证由 WAIT 返回的从站的数量接收。

  • 如果该命令是作为 MULTI 事务的一部分发送的,则该命令不会阻塞,而是仅返回 ASAP 确认先前写入命令的从站的数量。

  • 超时0意味着永远阻止。

  • 由于 WAIT 返回在失败和成功时都达到的从站数量,客户端应检查返回的值是否等于或大于它所要求的复制等级。

一致性和等待

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

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

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

实施细节

由于引入了与从节点的部分重新同步(PSYNC 功能),Redis 从节点使用它们已在复制流中处理的偏移量异步地对其主节点进行ping 操作。这用于多种方式:

  • 检测超时的奴隶。

  • 断开连接后执行部分重新同步。

  • 实施 WAIT。

在执行 WAIT 的特定情况下,Redis会记住,对于每个客户端,当给定的写入命令在给定客户端的上下文中执行时,生成的复制流的复制偏移量。当调用WAIT时,Redis会检查指定数量的从站是否已经确认了此偏移量或更大的偏移量。

返回值

整数应答:该命令返回在当前连接的上下文中执行的所有写操作所达到的从服务器的数量。

例子

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

在以下示例中,首次调用 WAIT 时不使用超时,并要求写入达到1个从站。它返回成功。在第二次尝试中,我们放了一个超时,并要求将写入复制到两个从站。由于有一个可用的从站,所以在 WAIT 解除阻塞并返回1秒之后,达到了从站的数量。