文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

redis实现消息队列的方法

2024-04-02 19:55

关注

这期内容当中的小编将会给大家带来有关redis实现消息队列的方法,以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

消息队列,Message Queue,常用于解决并发系统中的资源一致性问题,提升峰值的处理能力,同时保证消息的顺序性、可恢复性、必送达性,对应用进行解耦,或者实现异步通讯等。

市面上的 MQ应用有很多(例如:Kafka,RabbitMQ,Disque),同时也可以基于 Redis 来实现,比较典型的方案有:

基于List的 LPUSH+BRPOP 的实现

PUB/SUB,订阅/发布模式

基于Sorted-Set的实现

基于Stream类型的实现

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

生产,指的是将消息放入消息队列。

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

redis实现消息队列的方法

基于List的 LPUSH+BRPOP 的实现

典型的命令为:

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

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

该模式有很多优点:

实现简单

Reids支持持久化消息,意味着消息不会丢失,可以重复查看(注意不是消费,只看不用,LRANGE类的指令)。

可以保证顺序,保证使用LPUSH命令,可以保证消息的顺序性

使用RPUSH,可以将消息放在队列的开头,达到优先消息的目的,可以实现简易的消息优先队列。

同时也有些劣势:

做消费确认ACK比较麻烦,就是不能保证消费者在读取之后,未处理后的宕机问题。导致消息意外丢失。通常需要自己维护一个Pending列表,保证消息的处理确认。

不能做广播模式,例如典型的Pub/Discribe模式。

不能重复消费,一旦消费就会被删除

不支持分组消费,需要自己在业务逻辑层解决

PUB/SUB,订阅/发布模式

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

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

典型的优点是:

典型的广播模式,一个消息可以发布到多个消费者

多信道订阅,消费者可以同时订阅多个信道,从而接收多类消息

消息即时发送,消息不用等待消费者读取,消费者会自动接收到信道发布的消息

也有些缺点:

消息一旦发布,不能接收。换句话就是发布时若客户端不在线,则消息丢失,不能寻回

不能保证每个消费者接收的时间是一致的

若消费者客户端出现消息积压,到一定程度,会被强制断开,导致消息意外丢失。通常发生在消息的生产远大于消费速度时

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

基于SortedSet有序集合的实现

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

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

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

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

基于 Stream 类型的实现

这个Stream类型redis就是为了实现消息队列的。支持自动生成消息ID,分组消费,ACK,消息转移,队列监控等核心消息队列功能

上述就是小编为大家分享的redis实现消息队列的方法了,如果您也有类似的疑惑,不妨碍参照上述分析进行理解。如果想了解更多相关内容,请关注亿速云行业资讯。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯