CLIENT PAUSE
语法
CLIENT PAUSE timeout [WRITE | ALL]
- 可用版本
- Redis 开源版 3.0.0
- 时间复杂度
- O(1)
- ACL 分类
-
@admin
,@slow
,@dangerous
,@connection
,
CLIENT PAUSE
是一个连接控制命令,可以暂停所有 Redis 客户端指定的时长(单位:毫秒)。
该命令执行以下操作
- 对于给定模式,它停止处理来自普通客户端和 Pub/Sub 客户端的所有待处理命令。但是,与副本的交互将正常继续。请注意,客户端在尝试执行命令时才被正式暂停,因此服务器端不会为不活跃的客户端执行任何工作。
- 但是,它会尽快向调用者返回 OK,因此
CLIENT PAUSE
命令本身的执行不会被暂停。 - 当指定的时间过后,所有客户端都会被解除阻塞:这将触发处理在暂停期间累积在每个客户端查询缓冲区中的所有命令。
客户端暂停目前支持两种模式
ALL
:这是默认模式。所有客户端命令都会被阻塞。WRITE
:仅当客户端尝试执行写入命令时才会被阻塞。
对于 WRITE
模式,某些命令具有特殊行为
此命令非常有用,因为它能够以受控方式将客户端从一个 Redis 实例切换到另一个实例。例如,在实例升级期间,系统管理员可以执行以下操作
- 使用
CLIENT PAUSE
暂停客户端 - 等待几秒钟,确保副本处理了来自主节点的最新复制流。
- 将其中一个副本转换为主节点。
- 重新配置客户端以连接到新的主节点。
从 Redis 6.2 开始,推荐的客户端暂停模式是 WRITE
。此模式将停止所有复制流量,可以使用 CLIENT UNPAUSE
命令中止,并且允许重新配置旧的主节点,而不会在故障转移后冒险接受写入。这也是集群故障转移期间使用的模式。
对于 6.2 之前的版本,可以将 CLIENT PAUSE
命令与 INFO replication
命令一起发送到 MULTI/EXEC 块中,以便在客户端被阻塞时获取当前主节点的偏移量。通过这种方式,可以在副本端等待特定的偏移量,以确保处理了所有复制流。
从 Redis 3.2.10 / 4.0.0 开始,此命令还会在客户端暂停期间阻止键被逐出或过期。这样可以确保数据集是静态的,不仅从客户端无法写入的角度来看,也从内部操作的角度来看。
行为变更历史
>= 3.2.0
:客户端暂停也会阻止键的逐出和过期。
RESP2/RESP3 回复
简单字符串回复:OK
,如果超时无效则返回错误。历史
- 从 Redis 6.2.0 版本开始:添加了
CLIENT PAUSE WRITE
模式以及mode
选项。