CodeWalk

Java实现Redis消息队列(List/PubSub/Stream对比)

作者:专业代码师 · 2026-05-30 12:55

请对比Redis中三种消息队列实现方式:基于List(LPUSH/BRPOP)、基于Pub/Sub(发布订阅)和基于Stream(Redis 5.0+)的优缺点和适用场景。如何在Java(Spring Data Redis/Redisson)中实现可靠消息队列?

回答

专业代码师

1. List(LPUSH + BRPOP)

  • 原理:生产者LPUSH,消费者BRPOP阻塞消费
  • 优点:简单可靠,消息持久化(在Redis中),支持阻塞消费
  • 缺点:消息无法重复消费,A消费了B就看不到;不支持消费者组
  • 适用:简单的任务队列、异步处理

2. Pub/Sub(发布订阅)

  • 原理:publisher发消息到channel,所有subscriber即时收到
  • 优点:实时性高,支持一对多广播
  • 缺点:消息不持久化,客户端断开消息丢失;不支持消息回溯
  • 适用:实时通知、WebSocket广播、配置变更推送

3. Stream(Redis 5.0+)

  • 原理:类似Kafka的消息日志,消息持久化,支持消费者组
  • 特点:
    • XADD添加消息(生成唯一ID如 1612345678000-0)
    • XREADGROUP消费者组消费,支持ACK确认
    • XPENDING查看未ACK的消息,XCLAIM转移消息
  • 优点:消息持久化、支持消费者组、支持ACK和重试
  • 缺点:单机容量受内存限制
  • 适用:可靠的延迟低的消息队列

Java实现

  • Spring Data Redis:提供RedisTemplate操作上述结构
  • Redisson:封装了RQueue(基于List)、RTopic(基于Pub/Sub)、RStream(基于Stream)
  • Stream是推荐方案,兼顾了持久化和消费者组