等待
WAIT numreplicas timeout
- 可用时间
- 3.0.0
- 时间复杂度
- O(1)
- ACL 类别
-
@slow
,@connection
,
此命令会阻塞当前客户端,直到所有先前的写入命令都成功传输并得到至少在numreplicas
参数中指定的副本数量的确认。如果达到在timeout
参数中指定的超时时间(以毫秒为单位),则即使未达到指定的副本数量,命令也会返回。
此命令始终会返回当前客户端在WAIT
命令之前执行的写入命令被确认的副本数量,无论是否达到指定的副本数量或是否达到超时时间。
一些注意事项
- 当
WAIT
返回时,保证在当前连接上下文发送的所有先前的写入命令都已被WAIT
返回的副本数量接收。 - 如果该命令是在
MULTI
事务(从 Redis 7.0 开始,任何不允许阻塞的上下文,例如脚本内部)中发送,则该命令不会阻塞,而是立即返回先前写入命令被确认的副本数量。 - 超时时间为 0 表示无限期阻塞。
- 由于
WAIT
在失败和成功的情况下都会返回达到的副本数量,因此客户端应该检查返回的值是否等于或大于它要求的复制级别。
一致性和 WAIT
请注意,WAIT
不会使 Redis 成为一个强一致性存储:虽然同步复制是复制状态机的一部分,但它不是唯一需要的。但是,在 Sentinel 或 Redis Cluster 故障转移的背景下,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 个副本。它成功返回。在第二次尝试中,我们设置了一个超时时间,并要求将写入复制到两个副本。由于只有一个副本可用,所以在 1 秒后,WAIT
解除阻塞并返回 1,即达到的副本数量。