Redis WAIT命令

Redis wait命令将阻塞当前客户端,直到所有先前的写命令均已成功传输并至少有指定数量的副本答复。 如果指定的超时时间(以毫秒为单位)到达,即使尚未有指定数量的副本答复,命令也会返回。

在达到指定的副本数或达到超时的情况下,该命令将始终返回答复的副本数。

几点注意事项:

  1. 当WAIT返回时,通过WAIT返回时,的肯定收到了当前连接上下文中发送的所有写命令的指定副本数的回复。
  2. 如果命令是作为MULTI事务的一部分发送的,则该命令不会阻塞,而是尽快返回确认先前写入命令的副本数。
  3. 超时为0表示永远阻塞。
  4. 由于WAIT返回在失败和成功达到的副本数,因此客户端应检查返回的值等于或大于其所需的复本级别。

一致性和等待

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

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

但是,这只是尽力而为,因此可能仍然会丢失同步复制到多个副本的写操作。

实现细节

由于引入了与副本的部分重新同步(PSYNC功能),Redis副本以其复制流中已处理的偏移量异步ping其主副本。 有多种使用方法:

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

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

可用版本:从3.0.0开始可用
时间复杂度:O(1)

命令格式

WAIT numreplicas timeout

示例

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

在以下示例中,对WAIT的首次调用不使用超时,而是要求写入达到1个副本。 它以成功返回。 相反,在第二次尝试中,我们设置了超时时间,并要求将写入复制到两个副本。 由于只有一个副本,因此等待一秒钟后WAIT会解除阻止并返回1,因此副本数已达到。

返回值

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