*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。