*Redis client-unblock 命令
*语法
CLIENT UNBLOCK client-id [TIMEOUT | ERROR]
此命令可以从不同的连接解除被阻塞操作阻塞的客户端,例如 BRPOP 或 XREAD 或 WAIT。
默认情况下,客户端会像命令的超时时间已到一样被解除阻塞,但是如果传递了额外的(可选的)参数,则可以指定解除阻塞行为,可以是 TIMEOUT(默认值)或 ERROR。如果指定了 ERROR,行为是解除客户端阻塞并返回一个错误,表明客户端被强制解除阻塞。具体来说,客户端将收到以下错误:
-UNBLOCKED client unblocked via CLIENT UNBLOCK
注意:当然,通常不保证错误文本保持不变,但错误代码将保持为 -UNBLOCKED。
此命令特别有用,尤其是当我们使用有限数量的连接监视多个键时。例如,我们可能希望使用 XREAD 监视多个流而不使用超过 N 个连接。然而,在某个时刻,消费者进程被告知有一个更多的流键要监视。为了避免使用更多连接,最佳行为是停止连接池中某个连接的阻塞命令,添加新键,然后再次发出阻塞命令。
要获得此行为,可以使用以下模式。进程使用额外的控制连接在需要时发送 CLIENT UNBLOCK 命令。同时,在在其他连接上运行阻塞操作之前,进程运行 CLIENT ID 以获取与该连接关联的 ID。当需要添加新键或不再监视某个键时,通过在控制连接中发送 CLIENT UNBLOCK 来中止相关连接的阻塞命令。阻塞命令将返回,并最终可以重新发出。
此示例展示了在 Redis 流上下文中的应用,但该模式是通用的,可以应用于其他情况。
*示例
连接 A(阻塞连接):
> CLIENT ID
2934
> BRPOP key1 key2 key3 0
(客户端被阻塞)
... 现在我们要添加一个新键 ...
连接 B(控制连接):
> CLIENT UNBLOCK 2934
1
连接 A(阻塞连接):
... BRPOP 回复超时 ...
NULL
> BRPOP key1 key2 key3 key4 0
(客户端再次阻塞)
*返回值说明
以下之一: