WAITAOF
WAITAOF numlocal numreplicas timeout
- Available since:
- 7.2.0
- Time complexity:
- O(1)
- ACL categories:
-
@slow
,@blocking
,@connection
,
此命令会阻塞当前客户端,直到该客户端之前的所有写命令都被确认已同步到本地Redis的AOF和/或至少指定数量的副本。
numlocal
表示在继续之前需要确认的本地 fsync 数量。
当 numlocal
设置为 1 时,命令会阻塞,直到写入 Redis 实例的数据被确认持久化到本地 AOF 文件。
值为 0 时禁用此检查。
如果达到以毫秒为单位的超时时间,即使未满足指定的确认数量,命令也会返回。
该命令将始终返回在WAITAOF
命令之前,当前客户端发送的所有写命令已被所有主节点和副本节点fsync的数量,无论是在达到指定阈值的情况下,还是在达到超时的情况下。
几点说明:
- 当
WAITAOF
返回时,保证在当前连接上下文中发送的所有先前写入命令都已同步到至少由WAITAOF
返回的主服务器和副本数量的AOF中。 - 如果命令作为
MULTI
事务的一部分发送(或任何不允许阻塞的上下文,例如在脚本内部),该命令不会阻塞,而是立即返回已同步所有先前写命令的主节点和副本节点的数量。 - 超时时间为0意味着永远阻塞。
- 由于
WAITAOF
在成功和超时的情况下都会返回完成的fsyncs数量,客户端应检查返回的值是否等于或大于所需的持久化级别。 WAITAOF
不能在副本实例上使用,如果本地 Redis 没有启用 AOF,则numlocal
参数不能为非零。
限制
可以编写一个模块或Lua脚本,将写操作传播到AOF但不传播到复制流。
(对于模块,这是通过使用fmt
参数传递给RedisModule_Call
或RedisModule_Replicate
来实现的;对于Lua脚本,这是通过使用redis.set_repl
来实现的。)
这些特性与当前实现的WAITAOF
命令不兼容,同时使用它们可能会导致错误的行为。
一致性和WAITAOF
请注意,与WAIT
类似,WAITAOF
并不会使Redis成为强一致性存储。
除非等待集群中的所有成员将写入同步到磁盘,否则在故障转移或Redis重启期间,数据仍可能丢失。
然而,WAITAOF
确实提高了实际数据的安全性。
实现细节
自 Redis 7.2 起,即使没有配置副本(只要存在 AOF),Redis 也会跟踪并增加复制偏移量。
此外,Redis副本异步地向其主服务器发送两个复制偏移量的ping:它们在复制流中处理的偏移量,以及它们已同步到AOF的偏移量。
Redis会记住每个客户端在执行最后一个写命令时产生的复制流的复制偏移量。
当调用WAITAOF
时,Redis会检查本地Redis和/或指定数量的副本是否已经确认将这个偏移量或更大的偏移量fsync到它们的AOF中。
示例
> SET foo bar
OK
> WAITAOF 1 0 0
1) (integer) 1
2) (integer) 0
> WAITAOF 0 1 1000
1) (integer) 1
2) (integer) 0
在上面的例子中,第一次调用WAITAOF
没有使用超时,并要求将写入同步到本地Redis;当此操作完成时,它返回[1, 0]。
在第二次尝试中,我们指定了一个超时时间,并要求写入被确认为由单个副本进行fsync操作。
由于没有连接的副本,WAITAOF
命令在一秒后解除阻塞,并再次返回[1, 0],表示写入已在本地Redis上进行fsync操作,但没有副本。
RESP2/RESP3 回复
Array reply: 该命令返回一个包含两个整数的数组:
- 第一个是本地Redis的数量(0或1),这些Redis已经将当前连接上下文中执行的所有写操作同步到AOF
- 第二个是已经确认执行相同操作的副本数量。