阻塞命令是什么
BLPOP、BRPOP、BLMOVE、BZPOPMIN 这类阻塞命令在列表或有序集合为空时不会立即返回,而是把连接挂起等待元素出现;超时时间以秒为单位、支持小数,0 表示一直等。它们让队列消费不必空转轮询,但等待中的连接会持续占用连接资源,滥用会把 blocked_clients 堆起来。
基本信息
| 典型命令 | BLPOP、BRPOP、BLMOVE、BLMPOP、BZPOPMIN、BZPOPMAX、BZMPOP |
|---|---|
| 超时单位 | 秒,可带小数;0 表示永久阻塞 |
| 观测指标 | INFO clients 的 blocked_clients |
| 资源占用 | 阻塞连接同样计入 maxclients 与文件描述符 |
| 替代方式 | 短轮询、Streams 的阻塞读、独立消息中间件 |
典型使用场景
- 队列消费:用阻塞弹出替代轮询,避免空转带来的无效请求
- 即时通知:等待某个键出现后立刻继续处理后续步骤
- 连接规划:每个阻塞连接都占一个连接额度,需要一并计算
- 超时设计:给阻塞加超时,让消费端能周期性自检与重连
- 结构选择:需要消费组与确认机制时应改用 Streams
- 异常排查:blocked_clients 持续偏高说明消费能力不足或超时设置不当
常用形式
常用形式
redis-cli BLPOP queue:jobs 5 # 最多等 5 秒,超时返回空
redis-cli BRPOP queue:jobs 0 # 0 表示一直等,谨慎使用
redis-cli BLMOVE src dst LEFT RIGHT 10 # 阻塞式搬运元素,可用于可靠队列
redis-cli BZPOPMIN rank 3 # 有序集合的阻塞弹出
redis-cli INFO clients | grep -E 'blocked_clients' # 当前阻塞连接数
redis-cli CLIENT LIST | grep -c 'cmd=blpop' # 统计阻塞在具体命令上的连接消费方式对照
| 方式 | 优点 | 代价 |
|---|---|---|
| 阻塞弹出 | 没有空转,元素到达即可处理 | 连接被长期占用,计入连接上限 |
| 短轮询 | 实现简单,连接可复用 | 空查询消耗资源,延迟受轮询间隔限制 |
| Streams 阻塞读 | 支持消费组、确认与重投 | 需要改造客户端与数据结构 |
| 独立消息中间件 | 投递保证更强 | 引入额外组件与运维成本 |
永久阻塞的连接如果没有回收机制只会越积越多,生产上更推荐设超时并让消费端周期性自检。
阻塞连接同样占用连接额度:把连接池全部用于阻塞消费时,业务连接可能因为触及 maxclients 被拒绝。