WAIT

用法
WAIT numreplicas timeout
复杂度
O(1)
始于
3.0.0
ACL 类别
@connection, @blocking, @slow

此命令会阻塞当前客户端,直到所有先前的写入命令都成功传输并至少被指定数量的副本确认。如果达到以毫秒为单位指定的超时时间,即使未达到指定数量的副本,命令也会返回。

无论是否达到指定数量的副本,或者达到超时时间,该命令将始终返回WAIT 命令之前由当前客户端发送的写入命令已被确认的副本数量。

几点说明

  1. WAIT 返回时,当前连接上下文中发送的所有先前写入命令都保证已被 WAIT 返回的副本数量接收。
  2. 如果该命令在不允许阻塞的任何上下文(例如脚本内部)中发送,则命令不会阻塞,而是立即返回已确认先前写入命令的副本数量。
  3. 超时时间为 0 表示永远阻塞。
  4. 由于 WAIT 在失败和成功的情况下都会返回达到的副本数量,客户端应检查返回的值是否等于或大于其要求的复制级别。

一致性与 WAIT

请注意,WAIT 并不能使 Valkey 成为一个强一致性存储:虽然同步复制是复制状态机的一部分,但这并非唯一需要。然而,在 Sentinel 或 Valkey Cluster 故障转移的上下文中,WAIT 提高了实际数据安全性。

具体来说,如果某个写入被传输到一个或多个副本,那么在主节点失败时,我们更有可能(但不能保证)在故障转移期间提升一个已接收该写入的副本:Sentinel 和 Valkey Cluster 都会尽力在可用副本集中提升最佳副本。

然而,这只是一种尽力而为的尝试,因此仍然有可能丢失同步复制到多个副本的写入。

实现细节

自从引入与副本的部分重新同步(PSYNC 特性)以来,Valkey 副本会异步地向其主节点发送已在复制流中处理的偏移量。这有多种用途:

  1. 检测超时的副本。
  2. 在断开连接后执行部分重新同步。
  3. 实现 WAIT

具体到 WAIT 的实现,Valkey 会为每个客户端记住在给定客户端上下文中执行某个写入命令时产生的复制流的复制偏移量。当调用 WAIT 时,Valkey 会检查指定数量的副本是否已确认此偏移量或更大的偏移量。

示例

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

在以下示例中,第一次调用 WAIT 没有使用超时,并要求写入达到 1 个副本。它成功返回。第二次尝试我们设置了超时,并要求将写入复制到两个副本。由于只有一个副本可用,一秒后 WAIT 解除阻塞并返回 1,即达到的副本数量。

RESP2/RESP3 回复

整数回复:当前连接上下文中所有写入操作所达到的副本数量。