客户端解锁
Syntax
CLIENT UNBLOCK client-id [TIMEOUT | ERROR]
- Available since:
- 5.0.0
- Time complexity:
- O(log N) where N is the number of client connections
- ACL categories:
-
@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 回复
以下之一:
- Integer reply:
1
如果客户端成功解除阻塞。 - Integer reply:
0
如果客户端未被解除阻塞。