主题
Redis BRPOP 深度解析:从单队列到优先级队列
以 AI 漫剧项目的任务队列为案例 日期:2026-08-26
一、BRPOP 是什么
BRPOP = Blocking Right Pop,阻塞式右端弹出。
它是 Redis 列表(List)类型的命令,从列表的右端弹出一个元素,如果列表为空就阻塞等待,直到有新元素或超时。
列表: [A, B, C] BRPOP ──► 取出 C(右端),列表变成 [A, B]
列表: [] BRPOP ──► 阻塞等待,直到有人 LPUSH 新元素与 RPOP 的区别
| 命令 | 列表为空时 | 适用场景 |
|---|---|---|
RPOP key | 立即返回 nil | 轮询模式(需要 sleep + 循环) |
BRPOP key timeout | 阻塞等待,最多 timeout 秒 | 事件驱动模式(零 CPU 占用等待) |
为什么 Worker 用 BRPOP 而不是 RPOP
python
# ❌ RPOP 轮询模式:忙等,浪费 CPU
while True:
result = redis_client.rpop("task:queue")
if result:
process(result)
else:
time.sleep(0.1) # 空转 0.1 秒,不断查 Redis
# ✅ BRPOP 阻塞模式:没有任务时挂起,零 CPU
while True:
result = redis_client.brpop("task:queue", timeout=5)
if result:
process(result)
# timeout=5 只是定期检查 KeyboardInterrupt,不是忙等rpop(key) 参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
key | str | 是 | 要弹出的列表名 |
返回值:str | None
| 返回值 | 含义 |
|---|---|
"6" | 右端弹出的元素值 |
None | 列表为空 |
与 brpop 的关键区别:rpop 没有 timeout 参数,列表为空时立即返回 None,不等待。
brpop(keys, timeout) 参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
keys | str 或 list[str] | 是 | 要监听的列表名。传字符串监听 1 个队列,传列表监听多个(按顺序决定优先级) |
timeout | int | 否 | 最大阻塞秒数。0 = 永久阻塞(默认)。推荐 5,确保能响应 Ctrl+C |
返回值:tuple[str, str] | None
| 返回值 | 含义 |
|---|---|
("task:queue", "6") | 元组:[0] = 命中的队列名,[1] = 弹出的元素值 |
None | 超时无元素 |