Redis client unblock 命令

CLIENT UNBLOCK client-id [TIMEOUT|ERROR]

当客户端因为执行具有阻塞功能的命令如BRPOP or XREAD or WAIT被阻塞时,该命令可以通过另外的连接解除客户端的阻塞状态。

默认情况下,当命令超时时间(timeout)结束时,客户端会退出阻塞状态。当提供了额外参数选项时,可以获得命令解除阻塞的类型,可以是TIMEOUT或者ERROR类型。当是ERROR类型时,客户端阻塞被强制解除同时收到如下明确报错信息:

-UNBLOCKED client unblocked via CLIENT UNBLOCK

注意:通常情况下错误信息不会完全一样,但是错误代码中一定包含 -UNBLOCKED 关键字

UNBLOCK 在仅能使用较少连接但要监控大量keys的时候特别有用。

例如,使用 XREAD 命令和特定数量的连接监控多个字节流。在某个时间点,消费者进程需要监控一个新key的字节流。为了避免使用更多的连接,最好的办法是从连接池中停止阻塞的命令,增加新key的监控,然后再次执行阻塞命令。

为了实现这个目的,消费这进程需要使用一个辅助控制连接来发送 CLIENT UNBLOCK 命令。在执行阻塞命令的连接上执行阻塞命令之前,先执行 CLIENT ID 获取这个连接的 ID。当需要新增或删除key的监控时,通过控制连接发送 CLIENT UNBLOCK 命令解除阻塞的连接。阻塞的命令会退出阻塞状态,在执行完增加或删除监控后,再次执行阻塞命令。

例子:

Connection A (blocking connection):
> CLIENT ID
2934
> BRPOP key1 key2 key3 0
(client is blocked)

... Now we want to add a new key ...

Connection B (control connection):
> CLIENT UNBLOCK 2934
1

Connection A (blocking connection):
... BRPOP reply with timeout ...
NULL
> BRPOP key1 key2 key3 key4 0
(client is blocked again)

*返回值

Integer reply, specifically:

  • 1 if the client was unblocked successfully.
  • 0 if the client wasn’t unblocked.