Skip to content

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) 参数说明 ​

参数类型必填说明
keystr是要弹出的列表名

返回值:str | None

返回值含义
"6"右端弹出的元素值
None列表为空

与 brpop 的关键区别:rpop 没有 timeout 参数,列表为空时立即返回 None,不等待。

brpop(keys, timeout) 参数说明 ​

参数类型必填说明
keysstr 或 list[str]是要监听的列表名。传字符串监听 1 个队列,传列表监听多个(按顺序决定优先级)
timeoutint否最大阻塞秒数。0 = 永久阻塞(默认)。推荐 5,确保能响应 Ctrl+C

返回值:tuple[str, str] | None

返回值含义
("task:queue", "6")元组:[0] = 命中的队列名,[1] = 弹出的元素值
None超时无元素