今天给大家带来一篇关于Redis Stream的文章,文章会从消息队列的基本概念、然后基于Redis Stream基本操作,顺带着会讲Redis Stream的存储结构,最后配合在Spring Boot框架来讲解实战。阅读完这篇文章以后,基本上就能把Redis Stream拿捏住。
话不多说,开始~
也还是老规矩,先上导读图。
搞定Redis Stream
概念
Redis Stream 是Redis5.0推出的一种专门用来处理消息队列场景的高级数据结构,是Redis下消息队列的最佳实现。
stream全局图-不是我画的
这是一个很好的Redis Stream知识体系图,现在看着看不懂这个图也没有关系,我会由浅入深的给大家剖析该体系图。
什么是消息队列
队列是一种数据结构,对应到我们生活中的例子,就是排队。讲究着先来先处理的原则,目的是为了避免混乱与系统瘫痪。
消息队列把我们具体的业务,都抽象成为“消息”。排队做核酸,也可以叫做“核酸”队列。
刚说了队列是为了避免混乱与系统瘫痪,它还有一些其他的作用:
- 消峰填谷
这点表现最明显的就是我们常说的秒杀系统,访问量在某一个刻,到达巅峰,然后又断崖式下跌。
根据具体的业务场景,把业务处理的压力压入到消息队列中,以时间轴为水平线,来处理业务。
消峰填谷
- 异步解耦
假如有一个电商系统,在商品下单后,需要通知客服小二核对地址,需要通知物流仓储系统发货,需要营销中心发放优惠券 等等一些业务。
异步解耦
消息队列还有一些其他的作用,以上两个是比较典型的。
在Reids没有推出Stream数据类型的时候,我们也可以用Redis来做消息队列。分别是利用Reids的list和订阅/发布两种数据类型。
- list
用push命令压入队列,用pop命令来拿出队列里边的消息。
## 在 lianbianKey 里边压入2个消息,messageContent1、messageContent2
lpush lianbianKey messageContent1
lpush lianbianKey messageContent2
## 在另外一端,lpop命令取出元素
## lpop移除并获取第一个元素
lpop lianbainKey
- 订阅/发布
这个模式,和我们平常看电视频道类似,把电视台切换到湖南卫视,你就能自然看到当前电视台播放的节目(快乐大本营、天天向上 ...),就相当于你订阅了湖南卫视频道,在湖南卫视电视台发布节目的时候,你就能够很自然的接收到。但是这种模式有一个弊端,就是错过了就是错过了,错过了19:00的新闻联播,就是错过了。
都能实现消息队列,为什么Redis在5.0的版本里,还推出Stream数据类型呢?与list和订阅/发布又有什么异同呢?
为什么要Redis Stream
- 标准化操作
在没有Redis Stream推出的时候,我们知道利用Reids能够实现队列功能,但是大家实现得五花八门,没有一个统一的、标准的实现方式。最后导致的就是Redis队列生态显得乱,在推出Stream之后,后续实现队列都会使用该新的数据类型,利于标准化。
- 取长补短
不管是list还是订阅/发布模式,都有其弊端,比如list不能友好的重复消费,需要重复消费的话,需要程序代码去控制;而订阅/发布模式是一种转发消息的模式,只有订阅者在线的时候才能接收到消息,订阅者不在线期间产生的消息,就丢掉了。而Stream,有借鉴Kafka一些市面上成熟的消息队列的思想,可以消费失败重复消费,消息是持久化的。
- 降低门槛
不管是之前的list还是订阅/发布模式,其实就不能说是严谨的消息队