Redis发布订阅和Stream

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis发布订阅和Stream相关的知识,希望对你有一定的参考价值。

参考技术A

发布订单系统是日常开发中经常会用到的功能。简单来说,就是发布者发布消息,订阅者就会接受到消息并进行相应的处理,如下图所示。

Redis为我们提供了发布/订阅的功能模块PubSub,可以用于消息传递。

其中发布者publisher、订阅者subscriber都是redis客户端,channel则是redis服务器。

发布者publisher向channel发送消息,订阅该channel的subscriber就会接收到消息。

发布消息publish

订阅test1、test2的客户端会收到消息

按照上述这种方式,如果 订阅者subscriber想要订阅多个channel 则需要同时指定多个channel的名称,redis为了解决这个问题提供 psubscribe模式匹配 这种订阅方式,可以通过通配符的方式匹配频道。

发布消息

之前订阅ch*的客户端就会收到cha频道和china频道的消息,这样就一次性订阅多个频道

redis服务端存储了订阅频道/模式的客户端列表

相当于如果客户端订阅一个频道 ,那么服务端的 pubsub_channels 就会存储一条数据, pubsub_channels 其实是一个链表,key对应channel,value对应客户端列表,根据key订阅的频道,就可以找到订阅该频道的所有客户端。

同时如果客户端订阅一个模式 pubsub_patterns 也会新增一条数据,记录当前客户端订阅的模式, pubsub_patterns 也有自己的数据结构,其中就包含了客户端以及模式。

当发布者向某个频道发布消息时,就会遍历 pubsub_channels 找到订阅该频道的客户端列表,依次向这些客户端发送消息。

然后遍历 pubsub_patterns 找到符合当前频道的模式,同时找到模式对应的客户端,然后向客户端发送消息。

虽然Redis提供了发布/订阅的功能,但是并不完善,导致基本没有合适的场景能够使用。

PubSub缺点:

直到Redis5.0出现之后,出现了Stream这种数据结构,才终于完善了Redis的消息机制

Stream实际上就是一个消息列表,只是他几乎实现了消息队列所需要的所有功能,包括:

同时需要注意的是Stream只是一个数据结构,他不会主动把消息推送给消费者,需要消费者主动来消费数据

每个Stream都有唯一的名称,它就是Redis的key,首次使用 xadd 指令追加消息时自动创建。

常见操作命令如下表:

如果客户端希望知道自身消费到第几条数据了,那么就需要记录一下当前消费的消息ID,下次再次消费的时候就从上次消费的消息ID开始读取数据即可。

消费组中多了一个游标 last_delivered_id ,表示当前消费到了哪一条数据。同时所有的数据都是待处理消息( PEL ),只有消费者处理完毕之后使用 ack 指令告知redis服务器,数据才会从 PEL 中移除,确认后的消息就无法再次消费。

如果接收到的消息比较多,为了避免Stream过长,可以选择指定Stream的最大长度,一旦到达了最大长度,就会从最早的消息开始清除,保证Stream中最新的消息。

以上是关于Redis发布订阅和Stream的主要内容,如果未能解决你的问题,请参考以下文章

6Redis高级特性(发布和订阅Stream)

redis发布订阅模式

redis订阅断开后,怎么重新订阅

大数据之Redis:Redis的发布和订阅

redis中的订阅和发布详解

Redis专题-Redis的发布与订阅