基于List结构模拟消息队列
队列是入口和出口不在一起的,因此我们可以利用Redis的List结构模拟消息队列。利用LPUSH(从左侧添加元素)结合RPOP(从右侧取出元素)、RPUSH(从右侧添加元素)结合LPOP(从左侧取出元素)来实现。不过,该方式存在一个问题,当队列中没有消息时LPOP或者RPOP会返回null,并不能像阻塞队列那样会阻塞并等待消息。因此此处可使用BRPOP或者BLPOP来实现阻塞效果

优点
- 利用Redis存储,不受JVM内存上线
- 基于Redis的持久化机制,数据安全问题有保证
- 可以满足消息的有序性
缺点
- 无法避免消息丢失(消息POP后未被处理,则该消息会丢失掉)
- 只支持单消费者(消息POP后便从list中移除,无法为其他消费者提供服务)
基于PubSub(发布订阅)结构模拟消息队列
PubSub(发布订阅)是Redis2.0版本引入的消息传递模型。消费者可以订阅一个或者多个channel(信道)充当交换机,生产者向对应的channel中发送消息后,所有订阅者都可以收到相关的消息(类似于RabbitMQ中的Fanout模式)
- subscribe channel [channel]:订阅一个或者多个信道
- publish channel msg: 向一个信道中发送消息
- psubscribe pattern[pattern]: 订阅与pattern格式匹配的所有信道

优点
- 采用发布订阅模式,支持多个生产、消费
缺点
- 不支持数据持久化
- 无法避免消息丢失(消息发送成功后若无消费者接收则直接丢失了)
- 消息堆积有上线,超出时数据丢失
基于PubSub(发布订阅)结构模拟消息队列
Stream是Redis5.0引入的一种新的数据类型,可以实现一个功能丰富完善的消息队列


Stream类型消息队列的XREAD命令的特点
- 消息可回溯
- 一个消息可以被多个消费者读取
- 可以阻塞读取
- 有消息漏读的风险
评论区