客户端暂停

Syntax
CLIENT PAUSE timeout [WRITE | ALL]
Available since:
3.0.0
Time complexity:
O(1)
ACL categories:
@admin, @slow, @dangerous, @connection,

CLIENT PAUSE 是一个连接控制命令,能够暂停所有 Redis 客户端指定的时间(以毫秒为单位)。

该命令执行以下操作:

  • 它会停止处理来自普通和发布/订阅客户端的给定模式下的所有待处理命令。然而,与副本的交互将继续正常进行。请注意,当客户端尝试执行命令时,它们会被正式暂停,因此对于不活跃的客户端,服务器端不会进行任何工作。
  • 然而,它会尽快向调用者返回OK,因此CLIENT PAUSE命令的执行本身不会被暂停。
  • 当指定的时间过去后,所有客户端将被解除阻塞:这将触发处理在暂停期间每个客户端的查询缓冲区中积累的所有命令。

客户端暂停目前支持两种模式:

  • ALL: 这是默认模式。所有客户端命令都被阻止。
  • WRITE: 只有在客户端尝试执行写命令时才会被阻塞。

对于WRITE模式,一些命令具有特殊行为:

  • EVAL/EVALSHA: 将会阻塞所有脚本的客户端。
  • PUBLISH: 将会阻塞客户端。
  • PFCOUNT: 将会阻塞客户端。
  • WAIT: 确认将被延迟,因此此命令将显示为阻塞状态。

此命令非常有用,因为它能够以可控的方式将客户端从一个Redis实例切换到另一个实例。例如,在实例升级期间,系统管理员可以执行以下操作:

  • 使用 CLIENT PAUSE 暂停客户端
  • 等待几秒钟,以确保副本处理了来自主服务器的最新复制流。
  • 将其中一个副本转换为主节点。
  • 重新配置客户端以连接到新的主节点。

自 Redis 6.2 起,推荐的客户端暂停模式是 WRITE。此模式将停止所有复制流量,可以通过 CLIENT UNPAUSE 命令中止,并允许重新配置旧的主节点,而不会在故障转移后冒险接受写入。这也是集群故障转移期间使用的模式。

对于6.2之前的版本,可以在MULTI/EXEC块中发送CLIENT PAUSE命令,同时使用INFO replication命令来获取客户端被阻塞时的当前主节点偏移量。这样可以在副本端等待特定的偏移量,以确保所有复制流都已处理。

自 Redis 3.2.10 / 4.0.0 起,此命令还防止在客户端暂停期间键被驱逐或过期。这样,不仅从客户端无法写入的角度来看,数据集是静态的,而且从内部操作的角度来看也是如此。

行为变更历史

  • >= 3.2.0: 客户端暂停功能可以防止客户端暂停和键的驱逐。

RESP2/RESP3 回复

Simple string reply: OK or an error if the timeout is invalid.

历史

  • 从Redis版本6.2.0开始:添加了CLIENT PAUSE WRITE模式以及mode选项。
RATE THIS PAGE
Back to top ↑