等
语法
WAIT numreplicas timeout
- 从以下位置开始可用:
- 3.0.0
- 时间复杂度:
- O(1)
- ACL 类别:
-
@slow
,@blocking
,@connection
,
此命令会阻塞当前客户端,直到所有先前的写入命令
已成功转移并至少由该号码确认
您在numreplicas
论点。如果值
您为timeout
参数(以毫秒为单位),则命令
即使尚未达到指定数量的副本,也会返回。
该命令将始终返回已确认的副本数
当前客户端在WAIT
命令,这两种情况都是
达到指定的副本数或达到超时时。
几点评论:
- 什么时候
WAIT
返回时,在当前连接的上下文中发送的所有先前写入命令都保证被返回的副本数接收WAIT
. - 如果命令作为
MULTI
transaction (从 Redis 7.0 开始,任何不允许阻塞的上下文,例如在脚本内部),该命令不会阻塞,而是只返回 ASAP 确认先前写入命令的副本数。 - 超时为 0 表示永久阻止。
- 因为
WAIT
返回在失败和成功的情况下达到的副本数,客户端应检查返回的值是否等于或大于它所需的复制级别。
一致性和 WAIT
请注意,WAIT
并不能使 Redis 成为强一致性存储:虽然同步复制是复制状态机的一部分,但它并不是唯一需要的东西。但是,在 Sentinel 或 Redis 集群故障转移的上下文中,WAIT
提高实际数据安全性。
具体来说,如果给定的写入被传输到一个或多个副本,则更有可能(但不能保证)如果主副本发生故障,我们将能够在故障转移期间提升收到写入的副本:Sentinel 和 Redis Cluster 都将尽最大努力尝试在可用副本集中提升最佳副本。
但是,这只是一次尽力而为的尝试,因此仍有可能丢失同步复制到多个副本的写入作。
实现细节
自从引入与副本的部分重新同步(PSYNC 功能)以来,Redis 副本会使用它们在复制流中已经处理的偏移量异步 ping 其主服务器。这以多种方式使用:
- 检测超时副本。
- 断开连接后执行部分重新同步。
- 实现
WAIT
.
在实现WAIT
中,Redis 会记住每个客户端在给定
write 命令在给定客户端的上下文中执行。什么时候WAIT
是
called Redis 检查指定数量的副本是否已确认
这个偏移量或更大的偏移量。
例子
> SET foo bar
OK
> WAIT 1 0
(integer) 1
> WAIT 2 1000
(integer) 1
在以下示例中,对WAIT
不使用超时,并要求写入达到 1 个副本。它带着成功回来了。在第二次尝试中,我们设置了一个超时,并要求将写入复制到两个副本。由于只有一个副本可用,因此在 1 秒后WAIT
unblocks 并返回 1,即达到的副本数。