怀托夫
WAITAOF numlocal numreplicas timeout
- 从以下位置开始可用:
- 7.2.0
- 时间复杂度:
- O(1)
- ACL 类别:
-
@slow
,@blocking
,@connection
,
此命令会阻止当前客户端,直到确认该客户端之前的所有写入命令都已同步到本地 Redis 的 AOF 和/或至少指定数量的副本。
numlocal
表示在继续之前需要确认的本地 fsyncs 的数量。
什么时候numlocal
设置为 1 时,命令会阻塞,直到确认写入 Redis 实例的数据被持久化到本地 AOF 文件中。
值 0 将禁用此检查。
如果达到以毫秒为单位指定的超时,则即使未满足指定的确认数,该命令也会返回。
该命令将始终返回在WAITAOF
命令,无论是在满足指定阈值的情况下,还是在达到超时时。
几点评论:
- 什么时候
WAITAOF
返回,则保证在当前连接的上下文中发送的所有先前写入命令至少同步到 AOF 返回的 master 和 replica 数量WAITAOF
. - 如果命令作为
MULTI
transaction (或任何其他不允许阻塞的上下文,例如在脚本内),该命令不会阻塞,而是立即返回同步所有先前写入命令的主服务器和副本的数量。 - 超时为 0 表示永久阻止。
- 因为
WAITAOF
返回在成功和超时的情况下完成的 fsyncs 数,客户端应检查返回的值是否等于或大于所需的持久性级别。 WAITAOF
不能在副本实例上使用,并且numlocal
如果本地 Redis 未启用 AOF,则参数不能为非零。
局限性
可以编写一个模块或 Lua 脚本,将写入传播到 AOF,但不传播到复制流。
(对于模块,这是使用fmt
argument 设置为RedisModule_Call
或RedisModule_Replicate
;对于 Lua 脚本,这是通过redis.set_repl
.)
这些功能与WAITAOF
命令,并且将它们组合使用可能会导致不正确的行为。
一致性和 WAITAOF
请注意,与WAIT
,WAITAOF
不会使 Redis 成为强一致性存储。
除非等待集群的所有成员对磁盘进行 fsync 写入,否则在故障转移或 Redis 重启期间,数据仍可能丢失。
然而WAITAOF
确实提高了实际数据的安全性。
实现细节
从 Redis 7.2 开始,即使没有配置副本(只要 AOF 存在),Redis 也会跟踪并增加复制偏移量。
此外,Redis 副本使用两个复制偏移量异步 ping 其主服务器:它们在复制流中处理的偏移量,以及它们已同步到 AOF 的偏移量。
Redis 会记住每个客户端在该客户端的上下文中执行最后一个写入命令时生成的复制流的复制偏移量。
什么时候WAITAOF
调用时,Redis 会检查本地 Redis 和/或指定数量的副本是否已确认将此偏移量或更大的偏移量同步到其 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]。
在第二次尝试中,我们改为指定超时,并要求将写入确认为由单个副本 fsynced。
由于没有连接的副本,因此WAITAOF
命令在 1 秒后解除阻塞,并再次返回 [1, 0],表示写入已在本地 Redis 上同步,但没有副本。
RESP2/RESP3 回复
数组回复:该命令返回一个包含两个整数的数组:
- 第一个是在当前连接的上下文中执行的所有写入已同步到 AOF 的本地 Redise 数(0 或 1)
- 第二个是已确认执行相同作的副本数。