WAIT

阻塞,直到连接发送的所有先前写入命令的异步复制完成。

语法

WAIT numreplicas timeout

引入版本:3.0.0

复杂度摘要:O(1)

此命令会阻止当前客户端,直到所有先前的写入命令均成功传输并至少由您在 numreplicas 参数中指定的副本数量确认。如果达到为 timeout 参数指定的值(以毫秒为单位),则即使尚未达到指定的副本数量,该命令也会返回。

该命令将始终返回在 WAIT 命令之前确认当前客户端发送的写命令的副本数量,无论是达到指定的副本数量,还是达到超时。

几点说明:

  1. 当WAIT返回时,在当前连接的上下文中发送的所有先前的写命令都保证被WAIT返回的副本数量接收。
  2. 如果该命令作为 MULTI 事务的一部分发送(自 Redis 7.0 起,任何不允许阻塞的上下文,例如内部脚本),该命令不会阻塞,而是仅尽快返回已确认先前写入命令的副本数量。
  3. 超时为0意味着永远阻塞。
  4. 由于 WAIT 在失败和成功的情况下都会返回达到的副本数,因此客户端应检查返回的值是否等于或大于其所需的复制级别。

必需参数

numreplicas

等待的副本数量。

timeout

最长时间等待,以毫秒为单位。 0 意味着永远等待。

详细说明

一致性和等待

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

具体来说,如果将给定的写入传输到一个或多个副本,则更有可能(但不能保证)如果主服务器发生故障,我们将能够在故障转移期间提升接收写入的副本:Sentinel 和 Redis 集群都会尽最大努力尝试提升一组可用副本中的最佳副本。

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

实施

自从引入了与副本的部分重新同步(PSYNC 功能)以来,Redis 副本会使用它们已在复制流中处理的偏移量异步 ping 其主服务器。这有多种用途:

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

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

示例

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

在前面的示例中,第一个 WAIT 调用不使用超时。它等待写入到达一个副本并成功返回。

第二个 WAIT 调用使用超时并等待写入到达两个副本。由于只有一个副本可用,因此 WAIT 将在一秒后解锁并返回 1,即确认写入的副本数量。

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
✅ 标准
❌主动-主动*
❌ 标准**
❌主动-主动
*对于主动-主动数据库,主分片和副本分片复制支持 WAIT 命令。您可以联系支持人员以仅为本地副本启用 WAIT。跨实例复制不支持 WAIT。Redis 云灵活订阅支持
**WAIT 命令。

返回值

RESP2

整数回复:该命令返回当前连接上下文中执行的所有写入所达到的副本数。

RESP3

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

资料来源:Redis 官方 WAIT 文档;中文内容参考 Redis 文档许可。