消息队列
博主前面讲过各个消息队列的基础入门,那么处于成本考虑,Redis中也提供了三种不同的方式来实现消息队列:
- List结构:基于list结构模型模拟消息队列
- PubSub:基本的点对点消息模型
- Stream:比较完善的消息队列模型
基于list结构模型模拟消息队列
Redis的list模型是一个双向链表,很容易模拟出队列效果
我们可以通过LPUSH
结合RPOP
,或者RPUSH
结合LPOP
来实现
但是队列中没有消息的话会返回null,并不像JVM的阻塞队列那样会阻塞并等待消息
因此这里应该使用BRPOP
或者BLPOP
来实现阻塞效果
优点:
- 利用Redis存储,不限于JVM内存上限
- 基于Redis的持久化机制,数据安全性有保证
- 可以满足消息有序性
缺点:
- 无法避免消息丢失
- 只支持单消费者(同一条消息无法被多个消费者消费)
基于PubSub的消息队列
PubSub(发布订阅),消费者可以订阅一个或多个channel,生产者向对应channel发送消息后,所有的订阅者都能够收到相关信息
SUBSCRIBE channel [channel]
:订阅一个或多个频道
PUBLISH channel msg
:向一个频道发送消息
PSUBSCRIBE pattern[pattern]
:订阅与pattern格式匹配的所有频道
优点:
采用发布订阅模型,支持多生产,多消费
缺点:
- 不支持数据持久化
- 无法避免消息丢失
- 消息堆积有上限,超出时数据丢失
基于stream的消息队列
Stream是Redis 5.0 引入的一种新数据模型,可以实现一个功能非常完善的消息队列
XADD
:发送消息的命令
XREAD
:读取消息的命令
读取最新消息的命令:
XREAD COUNT 1 BLOCK 1000 STREAMS users $
在java代码中我们可以持续监听队列中最新的消息
while