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