*Redis CLIENT UNBLOCK 命令

CLIENT UNBLOCK 解除指定客户端的阻塞状态(如 BLPOP、BRPOP、BZPOPMIN 等阻塞命令)。


*语法

CLIENT UNBLOCK client-id [TIMEOUT | ERROR]

*参数说明

参数 类型 必填 说明
client-id Integer 要解除阻塞的客户端 ID
TIMEOUT Flag 模拟超时解除,被阻塞命令返回 (nil)
ERROR Flag 模拟错误解除,被阻塞命令返回错误

*返回值

  • 1:成功解除阻塞
  • 0:客户端不存在或未处于阻塞状态

*时间复杂度

O(1)

*

*示例

*解除客户端阻塞(默认超时)

> CLIENT LIST
id=3 addr=127.0.0.1:54321 ... cmd=blpop ...
> CLIENT UNBLOCK 3
(integer) 1

*模拟错误解除

> CLIENT UNBLOCK 3 ERROR
(integer) 1

*客户端未阻塞

> CLIENT UNBLOCK 4
(integer) 0

*常见错误

错误 原因 解决
ERR wrong number of arguments 未提供 client-id 必须提供客户端 ID
ERR value is not an integer or out of range client-id 不是整数 使用有效的客户端 ID
ERR syntax error 提供了未知的可选参数 使用 TIMEOUT 或 ERROR,或省略

*最佳实践

  • 用于管理后台任务,强制唤醒阻塞等待的客户端
  • TIMEOUT 模式让阻塞命令正常返回 (nil),客户端可继续执行后续逻辑
  • ERROR 模式让阻塞命令返回错误,客户端可进入错误处理流程
  • 配合 CLIENT LIST 查找 flags 包含 b 的阻塞客户端 ID

*FAQ

Q1: CLIENT UNBLOCK 和 CLIENT KILL 有什么区别? A: CLIENT UNBLOCK 只解除阻塞状态,保持连接;CLIENT KILL 直接断开连接。

Q2: 如果不指定 TIMEOUT 或 ERROR,默认行为是什么? A: 默认行为等效于 TIMEOUT,阻塞命令会返回 (nil)

Q3: 可以解除自己的阻塞吗? A: 可以,获取自己的 CLIENT ID 后对自己执行 CLIENT UNBLOCK。