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