美文网首页
Redis(五)-特性-消息队列

Redis(五)-特性-消息队列

作者: 进击的蚂蚁zzzliu | 来源:发表于2020-11-29 17:43 被阅读0次

概述

消息队列要能支持组件通信消息的快速读写,而Redis本身支持数据的高速访问,正好可以满足消息队列的读写性能需求。另外,消息队列在存取消息时,必须要满足三个需求:

  • 消息有序性:保证先进入队列的消息先消费;
  • 消息唯一性:每条消息有一个唯一的标识,消费者可以根据标识来避免该消息被重复消费;
  • 消息可靠性:消费者遇到宕机或重启等情况时消息不能丢失;

针对消息队列的需求,本节就来分析下Redis实现消息队列的方案

1. List实现

1.1 命令

BLPOP:队列为空时阻塞
LPUSH:队列满时阻塞
BRPOPLPUSH:取出消费同时保存到另外一个备份list

1.2 实现

消息队列-list-2.png

从消息有序性、唯一性、可靠性三个方面分析是否可行

  • 消息有序性:List本身就是按先进先出的顺序对数据进行存取的,已经能满足有序性;
  • 消息唯一性:唯一性无法保证,但是可以很容易实现,例如:producer给消息增加唯一前缀/后缀(LPUSH mq 20201129155328:1),consumer消费时截取出唯一标识(20201129155328)判断是否重复消费;
  • 消息可靠性:当consumer取出一条消息尚未消费时,consumer发生宕机或其他故障,此时消息将会丢失,因此不满足可靠性;

为了解决可靠性问题可以使用BRPOPLPUSH


消息队列-list-1.png

当consumer故障恢复后可以从备份队列中取出消息进行处理

2. Stream实现

Streams是Redis专门为消息队列设计的数据类型,它提供了丰富的消息队列操作命令;

2.1 命令

XADD:插入消息,消息的格式是键-值对形式,保证有序,可以自动生成全局唯一ID;
XREAD:用于读取消息,可以按ID读取数据;
XREADGROUP:按消费组形式读取消息;
XPENDING:用来查询每个消费组内所有消费者已读取但尚未确认的消息
XACK:用于向消息队列确认消息处理已完成

2.2 实现

消息队列-stream.png
1. XADD demo * key1 5:返回1606639485099-0,生成唯一id(前部分精确为毫秒数,后部分为该毫秒内序号)
2. XREAD block 10000 streams demo 1606639485099-0:取出1606639485099-0序号以后的所有消息,最长阻塞10000ms
3. XGROUP create demo group1 0:创建一个名为group1的消费组,这个消费组消费的消息队列是demo
4. XADD demo * key1 5:往demo中增加4个k-v
5.6.7. XREADGROUP group group1 consumer1 count 1 streams demo >:让group1中的consumer1、2、3各自读取一条消息
其他命令:
XREAD block 10000 streams stream $:取出最新一条消息,最长阻塞10000ms
XREADGROUP group group1 consumer1 streams stream >:让group1消费组里的消费者consumer1从mqstream中读取所有消息,其中,命令最后的参数“>”,表示从第一条尚未被消费的消息开始读取
XPENDING stream group1:查看group1中各个消费者已读取、但尚未确认的消息个数
XACK stream group1 1604471086842-0:group1确认消息1604471086842-0已经消费,这条消息就会被group1删除

2.3 三大需求分析

  • 消息有序性:XADD保证消息有序;
  • 消息唯一性:每条消息返回唯一id,保证消息唯一;
  • 消息可靠性:Streams会自动使用内部队列(也称为PENDING List)留存消费组里每个消费者读取的消息,直到消费者使用XACK命令通知Streams“消息已经处理完成”。如果消费者没有成功处理消息,它就不会给Streams发送XACK命令,消息仍然会留存。此时,消费者可以在重启后,用XPENDING命令查看已读取、但尚未确认处理完成的消息。

小结

list和streams对比

--------over---------

相关文章

  • Redis(五)-特性-消息队列

    概述 消息队列要能支持组件通信消息的快速读写,而Redis本身支持数据的高速访问,正好可以满足消息队列的读写性能需...

  • laravel队列背景知识

    redis队列 redis做消息队列的特性例如 FIFO(先进先出)很容易实现,只需要一个list对象从头取数据,...

  • Redis高级特性——消息队列

    消息队列 消息队列的设计方案在开发过程中应用比较广泛,一般情况都是为了实现程序解耦,生产者发送一个消息,消费者或多...

  • 04 redis的发布和订阅功能

    redis可以代替部分消息队列的功能。本文将演示redis的发布和订阅特性。 1、前提约束 已经安装好redis并...

  • redis消息队列的四种实现方式之List的简单队列和延时队列

    目录 《redis消息队列的四种实现方式之List的简单队列和延时队列》(本篇) 《redis消息队列的四种实现方...

  • 03_redis_延时队列

    对于只有一组消费者的队列,使用redis就可以了。但是没有太多的高级特性,没有ack保证。 异步消息队列 Redi...

  • phpredis实现消息队列

    通过redis的消息对列提高聊天服务器的并发量 消息队列 1.保存数据到队列 $redis = new redis...

  • phpredis实现消息队列

    通过redis的消息对列提高聊天服务器的并发量 消息队列 1.保存数据到队列 $redis = new redis...

  • Redis实现消息队列

    Redis实现轻量级的消息队列与消息中间件相比,没有高级特性也没有ACK保证,无法做到数据不重不漏,如果业务简单而...

  • Redis应用-布隆过滤器

    系列文章Redis应用-分布式锁Redis应用-异步消息队列与延时队列Redis应用-位图Redis应用-Hype...

网友评论

      本文标题:Redis(五)-特性-消息队列

      本文链接:https://www.haomeiwen.com/subject/mwkkwktx.html