*Redis CLIENT PAUSE 命令 暂停处理客户端命令一段时间

*语法说明

CLIENT PAUSE timeout [WRITE | ALL]

*中文详细说明

CLIENT PAUSE 命令暂停处理来自客户端的命令请求,暂停时间由 timeout 参数指定(单位为毫秒)。

暂停范围

  • ALL(默认):暂停所有来自普通客户端和 Pub/Sub 客户端的命令请求
  • WRITE(Redis 6.2+):仅暂停写命令(如 SETDEL 等),读命令(如 GET)仍可正常执行

重要行为

  • 调用者自身不会被暂停(命令立即返回 OK
  • 与从节点的复制命令不受影响
  • 暂停期间,所有客户端查询缓冲区中积累的命令会在暂停结束后被批量处理
  • 从 Redis 3.2.10 / 4.0.0 起,暂停期间也会停止 key 的过期和驱逐(eviction),保持数据处于静止状态

典型应用场景 — 实例切换

  1. 执行 CLIENT PAUSE 暂停所有客户端
  2. 等待几秒,让从节点处理完来自主节点的复制命令
  3. 将一个从节点提升为主节点
  4. 重新配置客户端连接到新的主节点

也可以配合 INFO replicationMULTI/EXEC 事务中使用,检查主节点的复制偏移量,确保数据同步完整后再切换。

*可运行示例

*示例 1:暂停所有客户端 5 秒

# 暂停所有客户端命令处理 5000 毫秒
redis-cli CLIENT PAUSE 5000

预期输出:

OK

*示例 2:仅暂停写命令(Redis 6.2+)

# 只允许读命令,暂停写命令 3 秒
redis-cli CLIENT PAUSE 3000 WRITE

# 此时其他连接的 GET 仍可执行,但 SET 会被阻塞

预期输出:

OK

*示例 3:配合事务获取复制信息

# 在事务中暂停并获取复制状态
redis-cli MULTI
redis-cli CLIENT PAUSE 10000
redis-cli INFO replication
redis-cli EXEC

预期输出:

OK
OK
OK
1) OK
2) "# Replication\r\nrole:master\r\nconnected_slaves:2\r\n..."

*示例 4:主从切换场景

# 步骤 1:暂停客户端写入
redis-cli CLIENT PAUSE 30000

# 步骤 2:检查从节点同步状态
redis-cli INFO replication

# 步骤 3:等待从节点 lag=0 后,将某个从节点提升为主节点
# redis-cli -h slave-host REPLICAOF NO ONE

# 步骤 4:重新配置其他从节点指向新主节点
# redis-cli -h other-slave REPLICAOF new-master 6379

# 步骤 5:恢复客户端(暂停时间到后自动恢复)

*返回值

  • 简单字符串回复(Simple String):成功时返回 OK
  • 错误回复(Error Reply)timeout 参数无效时返回错误

*版本兼容性

Redis 版本 变更说明
>= 6.2.0 新增 WRITE 模式,支持只暂停写命令
>= 3.2.10 / 4.0.0 暂停期间停止 key 的过期和驱逐
>= 2.9.50 新增 CLIENT PAUSE 命令
< 2.9.50 不支持此命令

*时间复杂度

O(1) — 常量时间。仅设置一个服务器级别的暂停状态。