#Redis黑马点评#(六)Redis当中的消息队列
目录
Redis当中的消息队列
一 基于List
二 基于PubSub
三 基于Stream
单消费模式
消费者组
Redis当中的消息队列
消息队列,字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色:
- 消息队列:存储和管理消息,也称为消息代理。
- 生产者:发送消息到消息队列。
- 消费者:从消息队列获取消息并处理消息。
一 基于List
底层是队列queue的形式
实现方式:
-
生产者:使用
LPUSH
或RPUSH
将消息写入队列。 -
消费者:使用
RPOP
或BLPOP
(阻塞式弹出)从队列中读取消息。
优点:
-
简单高效:性能高,适合简单场景。
-
阻塞模式:支持
BLPOP/BRPOP
避免轮询浪费资源。 -
持久化:结合 Redis 的持久化机制(RDB/AOF),消息可持久化。
缺点:
-
消息可靠性不足:消息被
RPOP
后即从队列删除,若消费者处理失败,消息会丢失。-
改进方案:使用
RPOPLPUSH
将消息转移到“处理中队列”,处理完成后再删除。
-
-
不支持多消费者:一条消息只能被一个消费者消费。
二 基于PubSub
原理:
Redis 的发布订阅(PubSub)模式支持消息的 广播机制,生产者发布消息,所有订阅该频道的消费者都会收到消息。
实现方式:
-
生产者:通过
PUBLISH
向频道发送消息。 -
消费者:通过
SUBSCRIBE
订阅频道,或PSUBSCRIBE
订阅模式匹配的频道。
优点:
-
实时广播:支持一对多消息分发。
-
轻量级:实现简单,无需维护消息存储。
缺点:
-
消息不可靠:无持久化机制,若消费者不在线,消息会丢失。
-
无消息堆积能力:无法缓存历史消息。
-
不支持消费者组:无法实现负载均衡。
三 基于Stream
原理:
Redis 5.0 引入的 Stream
数据结构,提供类似 Kafka 的 持久化日志队列 功能,支持消费者组、消息确认、消息回溯等高级特性。
常用命令
命令 | 作用 | 示例 |
---|---|---|
XADD | 添加消息 | XADD mystream * field1 value1 field2 value2 |
XREAD | 读取消息 | XREAD COUNT 2 STREAMS mystream 0 |
XRANGE | 按范围查询消息 | XRANGE mystream - + (全部消息) |
XGROUP | 管理消费者组 | XGROUP CREATE mystream mygroup 0 |
XACK | 确认消息处理完成 | XACK mystream mygroup 1526919030474-0 |
XCLAIM | 重新分配未确认的消息 | XCLAIM mystream mygroup consumer2 3600000 1526919030474-0 |
单消费模式
添加消息
读取消息
消费者组
概念:将多个消费者划分到一个组当中,监听同一个队列。
实现步骤:
1 创建消费者组
ID代表从队列的什么地方开始,如果队列当中原始的消息你不想获取你就可使用$符实现对最新的消息进行读取,如果你还需要获取就是用0从队列的第一个消息获取
2 消费者读取消息
0可以获取在pending-List未被确认的消息
一个组内一个进度,1被a读到,那b再接着读就会读到2。
读取消息后还需要确认,这些被读取到的内容还在Pending-List当中,读了就进pending list,然后没xack确认就一直呆在pending-list
3 确认消息
4 其他常见命令