基于Redis实现消息队列

基于Redis实现消息队列

使用Redis实现消息队列可以使用不同的数据结构,本文将分开详细叙述不同的方式

基于List模拟消息队列

使用LPUSH添加消息,使用BRPOP阻塞等待pop消息来实现消息队列

优点:

  • 利用Redis存储,不受JVM内存限制
  • 基于Redis的持久化机制,数据安全性有保证
  • 可以满足消息有序性
    缺点:
  • 无法避免消息丢失
  • 只支持单消费者

基于PubSub的消息队列

PubSub是Redis2.0引入的消息传递模型,消费者可以订阅多个channel,生产者向对应channel发送消息后,所以订阅者都能收到消息

基本命令

  • SUBSCRIBE channel xxx:订阅一个或多个频道
  • PUBLISH channel msg:向一个频道发送消息
  • PSUBSCRIBE pattern xxx:订阅与pattern格式匹配的所有频道

优点:

  • 采用发布订阅模型,支持多生产,多消费
    缺点:
  • 不支持数据持久化
  • 无法避免消息丢失
  • 消息堆积有上限,超出时数据丢失

基于Stream的消息队列

添加消息:
XADD key *(代表自动生成id) k v

读取消息:
XREAD 读几条消息 阻塞时间 key $(读取最新消息)

在业务中可以循环调用XREAD阻塞来查询最新消息,实现持续监听队列的效果

注意:当指定$时,代表读取最新的消息,如果处理一条消息的过程中,又来了两条消息,那下次处理的只能是最新的消息,发生消息遗漏的问题

特点:

  • 消息可回溯
  • 一个消息可以被多个消费者读取
  • 可以阻塞读取
  • 有消息漏读的风险

基于Stream的消息队列-消费者组模式

消费者组:将多个消费者划分到一个组中,监听同一个队列

创建消费者组:
XGROUP CREATE key groupName id

消费组读取消息
XREADGROUP GROUP group consumer key id

id可以指定 ‘>’ 从下一个未消费的消息开始

基于Stream实现秒杀业务

  • 创建Stream消息队列
  • 在认定有抢购资格后,直接向Stream中添加消息
  • 项目启动时,开启一个县城任务,尝试获取stream中的消息,完成下单
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踢足球的程序员·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值