redis 实现队列

发布时间: 更新时间: 总字数:716 阅读时间:2m 作者: IP上海 分享 网址

在 Redis 中实现队列通常使用 列表(List) 数据结构,结合以下命令实现先进先出(FIFO)的队列操作:


实现方案

1. 基本命令

  • 生产者:向队列添加元素。
    • LPUSH key element:将元素插入列表头部(左侧)。
    • RPUSH key element:将元素插入列表尾部(右侧)。
  • 消费者:从队列取出元素。
    • BRPOP key timeout:阻塞地从列表尾部(右侧)弹出元素(阻塞版 RPOP)。
    • BLPOP key timeout:阻塞地从列表头部(左侧)弹出元素(阻塞版 LPOP)。

2. 方向配对

  • 方案一(推荐)

    • 生产者:LPUSH 添加到头部。
    • 消费者:BRPOP 从尾部取出(FIFO 顺序)。
    # 生产者
    LPUSH myqueue "task1"
    LPUSH myqueue "task2"  # 列表顺序: ["task2", "task1"]
    
    # 消费者(阻塞直到元素存在)
    BRPOP myqueue 0        # 返回 "task1"
    
  • 方案二

    • 生产者:RPUSH 添加到尾部。
    • 消费者:BLPOP 从头部取出(FIFO 顺序)。
    # 生产者
    RPUSH myqueue "task1"
    RPUSH myqueue "task2"  # 列表顺序: ["task1", "task2"]
    
    # 消费者(阻塞直到元素存在)
    BLPOP myqueue 0        # 返回 "task1"
    

代码示例(Python)

生产者

import redis

r = redis.Redis()

# 添加任务到队列头部
r.lpush("myqueue", "task1")
r.lpush("myqueue", "task2")

消费者

import redis

r = redis.Redis()

while True:
    # 阻塞从队列尾部取出任务(timeout=0 表示无限等待)
    task = r.brpop("myqueue", timeout=0)
    print(f"Processing task: {task[1]}")

注意事项

  1. 可靠性问题

    • 使用 BRPOP/BLPOP 弹出的元素会立即从队列删除。若消费者崩溃,任务可能丢失。
    • 解决方案:需持久化或确认机制时,改用 Redis Streams(支持消息确认和消费者组)。
  2. 性能

    • Redis 列表的 LPUSH/RPUSHBRPOP/BLPOP 均为 O(1) 时间复杂度,适合高并发场景。
  3. 多队列优先级

    • BRPOP queue1 queue2 0 可同时监听多个队列,优先处理第一个非空队列。

扩展:可靠消息队列(Redis Streams)

若需消息持久化、消费者组和确认机制,使用 Streams

# 生产者发送消息
XADD mystream * field1 "value1"

# 消费者组读取
XGROUP CREATE mystream mygroup 0
XREADGROUP GROUP mygroup consumer1 BLOCK 0 STREAMS mystream >

以上是 Redis 实现队列的核心方法,根据场景选择列表(简单队列)或 Streams(可靠队列)。

Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数