WAITAOF
阻塞,直到连接发送的所有前面的写命令都写入主和/或副本的仅附加文件。
语法
WAITAOF numlocal numreplicas timeout
引入版本:7.2.0
复杂度摘要:O(1)
此命令会阻塞当前客户端,直到确认该客户端之前的所有写入命令已同步到本地 Redis 的 AOF 和/或至少指定数量的副本。
numlocal 表示在继续之前需要确认的本地 fsync 的数量。当numlocal设置为1时,命令会阻塞,直到确认写入Redis实例的数据已持久化到本地AOF文件为止。值 0 禁用此检查。
如果达到以毫秒为单位指定的超时,即使尚未满足指定的确认数量,该命令也会返回。
该命令将始终返回在 WAITAOF 命令之前已同步当前客户端发送的所有写入命令的主节点和副本节点的数量,无论是满足指定阈值的情况还是达到超时的情况。
几点说明:
- 当
WAITAOF返回时,当前连接上下文中发送的所有先前写命令都保证fsync到至少由WAITAOF返回的master和replicas数量的AOF中。 - 如果该命令作为
MULTI事务(或任何其他不允许阻塞的上下文,例如内部脚本)的一部分发送,则该命令不会阻塞,而是立即返回 fsync 所有先前写入命令的主节点和副本节点的数量。 - 超时为0意味着永远阻塞。
- 由于
WAITAOF在成功和超时的情况下都会返回完成的 fsync 数量,因此客户端应检查返回的值是否等于或大于所需的持久性级别。 WAITAOF不能在副本实例上使用,如果本地 Redis 未启用 AOF,则numlocal参数不能为非零。
必需参数
numlocal
等待 AOF fsync 的本地 Redis 实例数(0 或 1)。
numreplicas
等待 AOF fsync 的副本数量。
timeout
最长时间等待,以毫秒为单位。 0 意味着永远等待。
详细说明
限制
可以编写一个模块或 Lua 脚本,将写入传播到 AOF,但不传播到复制流。 (对于模块,这是使用 RedisModule_Call 或 RedisModule_Replicate 的 fmt 参数来完成的;对于 Lua 脚本,这是使用 redis.set_repl 来实现的。)
这些功能与当前实现的 WAITAOF 命令不兼容,组合使用它们可能会导致不正确的行为。
一致性和 WAITAOF
请注意,与 WAIT 类似,WAITAOF 并不使 Redis 成为强一致性存储。除非等待集群的所有成员将写入同步到磁盘,否则在故障转移或 Redis 重新启动期间数据仍然可能丢失。然而,WAITAOF 确实提高了现实世界的数据安全性。
实施
从 Redis 7.2 开始,即使没有配置副本(只要存在 AOF),Redis 也会跟踪并增加复制偏移量。
此外,Redis 副本使用两个复制偏移量异步 ping 其主节点:它们在复制流中处理的偏移量,以及它们已 fsync 到 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没有使用超时,只要求写入fsync到本地Redis;完成后返回 [1, 0]。
在第二次尝试中,我们改为指定超时,并要求写入被单个副本确认为 fsynced。由于没有连接的副本,WAITAOF 命令在一秒后解除阻塞,并再次返回 [1, 0],表示写入已在本地 Redis 上进行 fsync,但没有副本。
Redis Software 与 Redis Cloud 兼容性
| Redis 软件 |
Redis Cloud |
说明 |
|---|---|---|
| ✅ 标准 |
✅ 标准 |
返回值
RESP2
数组回复:该命令返回一个由两个整数组成的数组: 1. 第一个是已将当前连接上下文中执行的所有写入 fsync 到 AOF 的本地 Redis 数量(0 或 1)。第二个是已确认执行相同操作的副本数量。
RESP3
数组回复:该命令返回一个由两个整数组成的数组: 1. 第一个是已将当前连接上下文中执行的所有写入 fsync 到 AOF 的本地 Redis 数量(0 或 1)。第二个是已确认执行相同操作的副本数量。
资料来源:Redis 官方 WAITAOF 文档;中文内容参考 Redis 文档许可。