CLIENT UNBLOCK
语法
CLIENT UNBLOCK client-id [TIMEOUT | ERROR]
- 可用版本
- 5.0.0
- 时间复杂度
- O(log N),其中 N 是客户端连接数
- ACL 类别
-
@admin
,@slow
,@dangerous
,@connection
,
此命令可以从不同的连接中解封一个在阻塞操作(例如,BRPOP
或 XREAD
或 WAIT
)中被阻塞的客户端。
默认情况下,客户端将被解封,就像命令的超时时间已到一样,但如果传递一个额外的(可选)参数,则可以指定解封行为,可以是 TIMEOUT(默认)或 ERROR。如果指定了 ERROR,则行为是解封客户端并返回一个错误,指示客户端被强制解封。具体来说,客户端将收到以下错误
-UNBLOCKED client unblocked via CLIENT UNBLOCK
注意:当然,通常不能保证错误文本保持不变,但错误代码将保持为 -UNBLOCKED
。
此命令在使用有限连接数监控多个键时特别有用。例如,我们可能想使用 XREAD
监控多个流,但使用的连接数不超过 N 个。然而,在某些时候,消费者进程会被告知还有另一个流键需要监控。为了避免使用更多连接,最佳行为是停止连接池中某个连接的阻塞命令,添加新键,然后重新发出阻塞命令。
为了实现这种行为,使用了以下模式。该进程使用一个额外的 控制连接 来发送 CLIENT UNBLOCK
命令(如果有必要)。同时,在其他连接上运行阻塞操作之前,进程运行 CLIENT ID
以获取与该连接关联的 ID。当需要添加新键或不再需要监控某个键时,相关的连接阻塞命令将通过在控制连接中发送 CLIENT UNBLOCK
来中止。阻塞命令将返回,最后可以重新发出。
此示例展示了在 Redis 流环境下的应用,但该模式是通用的,可以应用于其他情况。
示例
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)
RESP2/RESP3 响应
以下之一