基于Redis实现消息队列典型方案

1 概述
2 基于List的 LPUSH+BRPOP 的实现
3 PUB/SUB,订阅/发布模式
4 基于SortedSet有序集合的实现
5 基于 Stream 类型的实现
6 其他实现

1 概述

消息队列,Message Queue,常用于解决并发系统中的资源一致性问题,提升峰值的处理能力,同时保证消息的顺序性、可恢复性、必送达性,对应用进行解耦,或者实现异步通讯等。市面上的 MQ应用有很多(例如:Kafka,RabbitMQ,Disque),同时也可以基于 Redis 来实现,比较典型的方案有:

  • 基于List的 LPUSH+BRPOP 的实现
  • PUB/SUB,订阅/发布模式
  • 基于Sorted-Set的实现
  • 基于Stream类型的实现

讨论之前,先推荐使用 Redis5.0中的Stream方案,一个几乎完美的Redis消息队列方案,http://www.hellokang.net/redis/stream.html。

在消息队列使用中,有生产者producter和消费者consumer。生产者负责生成消息,消费者负责使用处理消息。

生产,指的是将消息放入消息队列。 消费,指的是读取并处理消息。通常一个消息再被消费后,就应该从消息队列中删除。

接下来分别讨论具体实现方案。

2 基于List的 LPUSH+BRPOP 的实现

典型的命令为:

LPUSH,将消息队列
BRPOP,从队列中取出消息,阻塞模式

就是一个典型的基于FIFL队列的解决方案。其中LPUSH是生产者做的事,而BRPOP是消费者做的事。

该模式有很多优点:

  • 实现简单
  • Reids支持持久化消息,意味着消息不会丢失,可以重复查看(注意不是消费,只看不用,LRANGE类的指令)。
  • 可以保证顺序,保证使用LPUSH命令,可以保证消息的顺序性
  • 使用RPUSH,可以将消息放在队列的开头,达到优先消息的目的,可以实现简易的消息优先队列。

同时也有些劣势:

  • 做消费确认ACK比较麻烦,就是不能保证消费者在读取之后,未处理后的宕机问题。导致消息意外丢失。通常需要自己维护一个Pending列表,保证消息的处理确认。
  • 不能做广播模式,例如典型的Pub/Discribe模式。
  • 不能重复消费,一旦消费就会被删除
  • 不支持分组消费,需要自己在业务逻辑层解决

注意,没有好不好的技术,只有适合不适合。

3 PUB/SUB,订阅/发布模式

SUBSCRIBE,用于订阅信道
PUBLISH,向信道发送消息
UNSUBSCRIBE,取消订阅

生产者和消费者通过相同的一个信道(Channel)进行交互。信道其实也就是队列。通常会有多个消费者。多个消费者订阅同一个信道,当生产者向信道发布消息时,该信道会立即将消息逐一发布给每个消费者。可见,该信道对于消费者是发散的信道,每个消费者都可以得到相同的消息。典型的对多的关系。

典型的优点是:

  • 典型的广播模式,一个消息可以发布到多个消费者
  • 多信道订阅,消费者可以同时订阅多个信道,从而接收多类消息
  • 消息即时发送,消息不用等待消费者读取,消费者会自动接收到信道发布的消息

也有些缺点:

  • 消息一旦发布,不能接收。换句话就是发布时若客户端不在线,则消息丢失,不能寻回
  • 不能保证每个消费者接收的时间是一致的
  • 若消费者客户端出现消息积压,到一定程度,会被强制断开,导致消息意外丢失。通常发生在消息的生产远大于消费速度时

可见,Pub/Sub 模式不适合做消息存储,消息积压类的业务,而是擅长处理广播,即时通讯,即时反馈的业务。

4 基于SortedSet有序集合的实现

ZADD KEY score member,压入集合
ZRANGEBYSCORE,依据score获取成员

有序集合的方案是在自己确定消息顺ID时比较常用,使用集合成员的Score来作为消息ID,保证顺序,还可以保证消息ID的单调递增。通常可以使用时间戳+序号的方案。确保了消息ID的单调递增,利用SortedSet的依据Score排序的特征,就可以制作一个有序的消息队列了。

和上面的方案相比,优点就是可以自定义消息ID,在消息ID有意义时,比较重要。缺点也明显,不允许重复消息(以为是集合),同时消息ID确定有错误会导致消息的顺序出错。

所以,若不是需要自定义消息ID,这个方案好像有点鸡肋...

5 基于 Stream 类型的实现

这个Stream类型redis就是为了实现消息队列的。支持自动生成消息ID,分组消费,ACK,消息转移,队列监控等核心消息队列功能,请参考:基于Redis的Stream类型的完美消息队列解决方案,http://www.hellokang.net/redis/stream.html,来获取完整方案。

6 其他实现

很多成熟的MQ产品:

  • Disque,https://disquedurinterne.net/
  • Kafka,http://kafka.apache.org/
  • ActiveMQ,http://activemq.apache.org/
  • RockMQ,http://rocketmq.apache.org/
  • RabbitMQ,https://www.rabbitmq.com/
  • ZeroMQ,http://zeromq.org/

欢迎关注微信:小韩说课,有Redis,MySQL系列,免费教程。

activemq消息丢失_基于Redis实现消息队列的典型方案相关推荐

  1. 基于Redis实现延时队列的优化方案

    一.延时队列的应用 近期在开发部门的新项目,其中有个关键功能就是智能推送,即根据用户行为在特定的时间点向用户推送相应的提醒消息,比如以下业务场景: 在用户点击充值项后,半小时内未充值,向用户推送充值未 ...

  2. 【BCVP】实现基于 Redis 的消息队列

    聆听自己的声音 如果自己学不动了,或者感觉没有动力的时候,看看书,听听音乐,跑跑步,休息两天,重新出发,偷懒虽好,可不要贪杯. 话说上回书我们说到了,Redis的使用修改<[BCVP更新]Sta ...

  3. activemq消息丢失_面试必问之消息中间件

    1. 的几种通信方式 publish(发布)-subscribe(订阅)(发布-订阅方式) 发布/订阅方式用于多接收客户端的方式.作为发布订阅的方式,可能存在多个 接收客户端,并且接收端客户端与发送客 ...

  4. java redis延迟队列_基于redis实现的延迟消息队列

    delay-queue redis实现延迟消息队列 需求背景 最近在做一个排队取号的系统 在用户预约时间到达前XX分钟发短信通知 在用户预约时间结束时要判断用户是否去取号了,不然就记录为爽约 在用户取 ...

  5. 基于Redis的消息队列php-resque

    转载:http://netstu.5iunix.net/archives/201305-835/ 最近的做一个短信群发的项目,需要用到消息队列.因此开始了我对消息队列选型的漫长路. 为什么选型会纠结呢 ...

  6. 秒杀抢购异步下单:基于Redis的消息队列秒杀抢购异步下单功能

    学习Redis时,练习的实战项目代码--基于Redis的Stream类型的秒杀抢购异步下单. 说明: Redis的stream类型的消息队列实现异步下单功能.Redis版本至少要5.0及以上版本才可以 ...

  7. 基于Redis的消息中心缓存搭建

    背景 问题分析 在以往的经历中出现了在大批用户涌入消息中心时,造成数据库负载急剧升高的问题,经过排查,发现原因主要有以下几点: 消息中心相关表中,部分体量较大的数据表没有创建索引,查询操作中数据库连接 ...

  8. python在通信中的应用_基于Redis的进程间通信——在C++里使用python的深度学习模型...

    本文主要是为进程间通信(特别是语言都不同的进程)提供一种新的思路本想法来源于RoboMaster比赛中的神符检测,神符是指一个9宫格的手写体数字(Mnist)或火焰体动态数字,需要用到机器学习或深度学 ...

  9. MySQL存储用户点赞的信息_基于redis实现的点赞功能设计

    点赞是我们现在经常见到的一个效果,如朋友圈.微博都有点赞的效果,下面这篇文章主要跟大家分享了基于 redis实现的点赞功能设计思路的相关资料,文中介绍的非常详细,对大家实现点赞功能具有一定的参考学习价 ...

最新文章

  1. 在Windows上使用LaTeX
  2. Linux的profile与bashrc的分析
  3. 小五思科技术学习笔记之SSH
  4. 知乎的 Flink 数据集成平台建设实践
  5. 挖洞技巧:支付漏洞之总结
  6. 小程序设计避免犯什么错_新设计师犯下的5种印刷错误以及如何避免
  7. 前端学习(1969)vue之电商管理系统电商系统之渲染动态参数和静态参数的表格
  8. Spring 系统学习:Spring的事务管理---事务回顾
  9. 全球首发!计算机视觉Polygon Mesh Processing总结10——DEFORMATION
  10. android 返回键退出程序了吗?
  11. 数据预处理之数据描述
  12. php中绘制长方体,php代码将常见的长方形图片修改为正方形的图片
  13. C# 解密微信步数 报错“填充无效,无法被移除。”
  14. vc2008/2015/2019, linux, mingw 和 mac 环境编译 boost_1_62_0
  15. ARP协议报文格式及ARP表简述
  16. python处理xps文件_xps/pdf/png/json转换
  17. oracle数据库审计要素,明御数据库审计及风险控制系统招标参数.docx
  18. ajax帝国cms自动加载分页,帝国CMS7.0版ajax无刷新添加评论插件
  19. Python 结巴(jieba)库之花拳绣腿
  20. CSDN 上传资源已经存在

热门文章

  1. js 字符串换行_JS代码编程中经常用到的超长字符串换行方法,你最喜欢哪一种?
  2. 为何python不好找工作-谁说Python找工作难?人生苦短,Python工程师你们还好吗?...
  3. python编程入门-Python编程入门难不难
  4. 自学python要多久-大家觉得自学python多久能学会?
  5. python基础编程语法-Python基础语法(Python基础知识点)
  6. 自学python能学成吗-Python能自学成功吗?
  7. python做excel自动化-python操作excel让工作自动化
  8. lda主题模型困惑度_主题模型(三):LDA主题个数选择
  9. Web API-时间对象和戳
  10. Vue自定义组件封装及使用Excel