directory search
Cluster cluster addslots(集群 槽位) cluster count failure reports(集群计数失败报告) cluster countkeysinslot cluster delslots cluster failover cluster forget cluster getkeysinslot cluster info cluster keyslot(集群键槽) cluster meet cluster nodes(集群节点) cluster replicate(集群复制) cluster reset(集群重置) cluster saveconfig cluster set config epoch cluster setslot cluster slaves cluster slots readonly readwrite Connection auth echo ping quit select swapdb Geo geoadd geodist geohash geopos georadius georadiusbymember Hashes hdel hexists hget hgetall hincrby hincrbyfloat hkeys hlen hmget hmset hscan hset hsetnx hstrlen hvals HyperLogLog pfadd pfcount pfmerge Keys del dump exists expire expireat keys migrate move object persist pexpire pexpireat pttl randomkey rename renamenx restore scan sort touch ttl type unlink wait Lists blpop brpop brpoplpush lindex linsert llen lpop lpush lpushx lrange lrem lset ltrim rpop rpoplpush rpush rpushx Pub/Sub psubscribe publish pubsub punsubscribe subscribe unsubscribe Scripting eval evalsha script debug script exists script flush script kill script load Server bgrewriteaof bgsave client getname client kill client list client pause client reply client setname command command count command getkeys command info config get config resetstat config rewrite config set dbsize debug object debug segfault flushall flushdb info lastsave monitor role save shutdown slaveof slowlog time Sets sadd scard sdiff sdiffstore sinter sinterstore sismember smembers smove spop srandmember srem sscan sunion sunionstore Sorted Sets zadd zcard zcount zincrby zinterstore zlexcount zrange zrangebylex zrangebyscore zrank zrem zremrangebylex zremrangebyrank zremrangebyscore zrevrange zrevrangebylex zrevrangebyscore zrevrank zscan zscore zunionstore Strings append bitcount bitfield bitop bitpos decr decrby get getbit getrange getset incr incrby incrbyfloat mget mset msetnx psetex set setbit setex setnx setrange strlen Transactions discard exec multi unwatch watch
characters

WAIT numslaves timeout

自3.0.0起可用。

时间复杂度: O(1)

该命令将阻止当前客户端,直到所有先前的写入命令成功传输并且至少由指定数量的从站确认。如果达到超时(以毫秒为单位),则即使尚未达到指定数量的从站,该命令也会返回。

在达到指定数量的从站或达到超时时,该命令将始终返回确认在WAIT命令之前发送的写入命令的从站数量。

几句话:

  1. 当 WAIT 返回时,在当前连接的上下文中发送的所有先前的写入命令被保证由 WAIT 返回的从站的数量接收。

  1. 如果该命令是作为 MULTI 事务的一部分发送的,则该命令不会阻塞,而是仅返回 ASAP 确认先前写入命令的从站的数量。

  1. 超时0意味着永远阻止。

  1. 由于 WAIT 返回在失败和成功时都达到的从站数量,客户端应检查返回的值是否等于或大于它所要求的复制等级。

一致性和等待

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

具体而言,如果给定的写入被传输到一个或多个从属设备,则更有可能(但不能保证),如果主设备出现故障,我们将能够在故障转移期间提升接收写入的从设备:Sentinel 和 Redis Cluster 将尽最大努力尝试在可用的从站集合中提升最佳的从站。

但是,这只是尽力而为的尝试,所以仍然可能会丢失同步复制到多个从服务器的写入。

实施细节

由于引入了与从节点的部分重新同步(PSYNC 功能),Redis 从节点使用它们已在复制流中处理的偏移量异步地对其主节点进行ping 操作。这用于多种方式:

  1. 检测超时的奴隶。

  1. 断开连接后执行部分重新同步。

  1. 实施 WAIT。

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

返回值

整数应答:该命令返回在当前连接的上下文中执行的所有写操作所达到的从服务器的数量。

例子

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

在以下示例中,首次调用 WAIT 时不使用超时,并要求写入达到1个从站。它返回成功。在第二次尝试中,我们放了一个超时,并要求将写入复制到两个从站。由于有一个可用的从站,所以在 WAIT 解除阻塞并返回1秒之后,达到了从站的数量。

Previous article: Next article: