Java实现Redis消息队列(List/PubSub/Stream对比)
请对比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是推荐方案,兼顾了持久化和消费者组