关键词:
参考技术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专题-redis的发布与订阅
文章目录1.发布和订阅1.1什么是发布和订阅1.2Redis的发布和订阅1.3如何实现1.3.1命令行实现1.3.2编程实现1.发布和订阅1.1什么是发布和订阅发布订阅是一种应用程序(系统)之... 查看详情
redis中的订阅和发布详解
阅读目录解释1图解订阅和发布2发布订阅常见命令3订阅发布操作解决中文乱码4模糊匹配订阅发布解释redis中的订阅和发布详解,它像一个广播系统,多个订阅者可以订阅一个频道,然后发布者往这个频道中发布消息,订阅者都能... 查看详情
06-redis的发布和订阅
啥是发布和订阅Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis客户端可以订阅任意数量的频道。Redis的发布和订阅客户端可以订阅频道如下当给这个频道腹部信息后,消息... 查看详情
[redis6]发布和订阅
Redis6的发布和订阅什么是发布和订阅Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis客户端可以订阅任意数量的频道。发布订阅命令行实现打开一个客户端订阅channel1打开另一个... 查看详情
redis发布订阅和事务实现原理(代码片段)
Redis发布订阅和事务实现原理发布订阅实现频道订阅与退订频道模式订阅与退订发送消息事务事务队列执行事务WATCH命令实现ACID原子性一致性隔离性持久性发布订阅Redis的发布订阅由PUBLISH,SUBSCRIBE,PSUBSCRIBE等命令组成,例... 查看详情
redis发布订阅和事务实现原理(代码片段)
Redis发布订阅和事务实现原理发布订阅实现频道订阅与退订频道模式订阅与退订发送消息事务事务队列执行事务WATCH命令实现ACID原子性一致性隔离性持久性发布订阅Redis的发布订阅由PUBLISH,SUBSCRIBE,PSUBSCRIBE等命令组成,例... 查看详情
redis的发布和订阅
发布publish订阅subscribeRedis通过 PUBLISH 、 SUBSCRIBE 等命令实现了订阅与发布模式。 举例1:qq群的公告,单个发布者,多个收听者发布/订阅实验发布订阅的命令PUBLISHchannelmsg将信息message发送到指定的频道c... 查看详情
利用redis简单实现消息订阅和发布
...dis相对小俏,简单实现,一下先介绍redis实现;1,redis实现消息发布和订阅,/***CreatedbySDingBa.xiongon17-3-9.*/publicclassRedisMsgPubSubListenerextendsJedisPubSubprivatestaticfi 查看详情
reids学习发布和订阅(代码片段)
文章目录一、什么是发布和订阅?二、Redis的发布和订阅三、发布订阅命令实现一、什么是发布和订阅?Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis客户端可以订阅任... 查看详情
redis6发布订阅及redis新数据类型
Redis6Redis的发布和订阅什么是发布和订阅Redis的发布和订阅发布订阅命令行实现Redis新数据类型Bitmaps常用命令1、setbit2.实例3.getbit4.实例5.bitcount6.实例7.bitop8.实例Bitmaps与set对比HyperLogLog----解决基数问题(不重复元素的相关问题)常用... 查看详情
laravel扩展使用redis发布与订阅(代码片段)
...录业务场景结合laravel订阅消息并处理安装及创建文件Redis发布订阅LaravelPredisErrorwhilereadinglinefromtheserver.业务场景项目业务场景中需要去订阅部门的数据,技术栈这块经过商讨决定采用了redis发布publish和订阅subscribe的特性。shell测... 查看详情
laravel扩展使用redis发布与订阅(代码片段)
...录业务场景结合laravel订阅消息并处理安装及创建文件Redis发布订阅LaravelPredisErrorwhilereadinglinefromtheserver.业务场景项目业务场景中需要去订阅部门的数据,技术栈这块经过商讨决定采用了redis发布publish和订阅subscribe的特性。shell测... 查看详情
redis发布订阅模式
参考技术A最近项目中,有个功能点是利用redis的发布订阅机制,进行服务器本地缓存数据同步。由于redis发布订阅功能的可靠性较差,在项目中出现了有服务器没有订阅成功问题,以及服务器订阅消息不及时,导致部分业务受到... 查看详情
redis中的订阅和发布详解
...古人学问遗无力,少壮功夫老始成〞redis中的订阅和发布详解,它像一个广播系统,多个订阅者可以订阅一个频道,然后发布者往这个频道中发布消息,订阅者都能够收到。如果这篇文章能给你带来一点帮助... 查看详情
redis发布订阅
Redis发布订阅 Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis客户端可以订阅任意数量的频道。下图展示了频道channel1,以及订阅这个频道的三个客户端——client2、client5和clien... 查看详情
stream入门(代码片段)
...队列(MQ,MessageQueue)。其实Redis本身有一个发布订阅(publish/subscribe)来实现消息队列的功能,但是有一个缺点就是消息无法持久化,如出现网络断开或者Redis宕机,那么消息则会被丢弃。总结就是... 查看详情
springbootredisspringboot集成redis的发布订阅机制(代码片段)
一.简单介绍1.redis的发布订阅功能,很简单。 消息发布者和消息订阅者互相不认得,也不关心对方有谁。 消息发布者,将消息发送给频道(channel)。 然后是由频道(channel)将消息发送给对自己感兴趣的消息订... 查看详情
利用redis简单实现消息订阅和发布
...dis相对小俏,简单实现,一下先介绍redis实现;1,redis实现消息发布和订阅,/***CreatedbySDingBa.xiongon17-3-9.*/publicclassRedisMsgPubSubListenerextendsJedisPubSubprivatestaticfinalLoggerlogger=LoggerFactory.getLogger(RedisMsgPubSubListener.class);@ResourceprivateAdOriginalit... 查看详情