深入浅出Redis(九):Redis的发布订阅模式

冯诺依曼架构
• 阅读 159

引言

Redis是一款基于内存的键值对数据库,提供了多种数据结构存储数据,存取数据的速度还非常快,除了这些优点它还提供了其他特色功能,比如:管道、lua脚本、发布订阅模型

本篇文章主要描述发布订阅模型,将围绕发布订阅深入浅出的描述发布订阅的使用和数据结构实现原理

发布订阅

发布订阅是一种消息通信模式

发送者(pub)发送消息到频道(channel),订阅者(sub)接收频道的消息

其中发送者、订阅者都是客户端,频道维护在服务端

Redis提供订阅频道、模式两种方式,模式可以理解为匹配正则的频道 (比如 new.it 匹配 new.*模式)

深入浅出Redis(九):Redis的发布订阅模式

使用命令

subscribe channel...订阅一个或多个频道

unsubscribe channel...退订一个或多个频道

psubscribe pattern...订阅一个或多个符合模式的频道 (比如 new.it 符合new.*模式)

publish channel message将消息发送到指定频道

pubsub subcommand argument...查看订阅与发布系统状态

punsubscribe pattern...退订所有给定模式的频道

使用
 #testchannel为频道 hello!caicai为消息
 #客户端A发送消息 返回0 表示0个客户端接收 此时还没订阅频道   
 127.0.0.1:6379> publish testchannel hello!caicai
 (integer) 0
 ​
 #客户端B订阅testchannel频道
 127.0.0.1:6379> subscribe testchannel
 Reading messages... (press Ctrl-C to quit)
 1) "subscribe"
 2) "testchannel"
 3) (integer) 1
 ​
 #客户端A发送消息 返回1 说明1个客户端接收到 
 127.0.0.1:6379> publish testchannel hello!caicai
 (integer) 1
 ​
 #客户端B收到消息
 1) "message"
 2) "testchannel"
 3) "hello!caicai"
 ​
 #客户端C使用模式进行订阅 订阅符合test*模式的频道(*为通配) testchannel符合test*
 127.0.0.1:6379> psubscribe test*
 Reading messages... (press Ctrl-C to quit)
 1) "psubscribe"
 2) "test*"
 3) (integer) 1
 ​
 #客户端A发送消息 返回2 说明2个客户端接收到 
 127.0.0.1:6379> publish testchannel hello!caicai2
 (integer) 2
 ​
 #客户端B显示
 1) "message"
 2) "testchannel"
 3) "hello!caicai2"
 ​
 #客户端C显示
 1) "pmessage"
 2) "test*"
 3) "testchannel"
 4) "hello!caicai2"

原理

subscribe channel 订阅频道维护字典,K为频道,V为链表,节点为订阅频道的客户端;客户端订阅或退订频道则是在字典中添加/删除

psubscribe pattern 订阅模式维护链表,节点为模式名与客户端;客户端订阅或退订模式频道则是在链表上遍历添加/删除

publish 发送消息时,先找到字典中的K频道遍历链表发送消息,再去模式中的链表上遍历频道是否与节点上的模式名匹配,匹配则发送消息给对应客户端

  • pubsub查看订阅信息则是通过字典和链表获取到信息

    • pubsub channels (pattern)则是找到字典中的频道返回链表长度表示这个频道的订阅数量,如果携带了pattern则返回满足匹配的频道
    • pubsub numsub channels 返回字典中频道对应的链表长度
    • pubsub numpat pattern模式数量,返回模式链表长度

通过发布订阅模型能够实现订阅、通知系统,哨兵模式中也使用发布订阅模式,哨兵订阅主节点,主节点收到某个哨兵命令后发布返回信息,各个哨兵收到消息后能够感知其他哨兵的存在

总结

本文围绕Redis的发布订阅模型,深入浅出描述了发布订阅模型的使用、发布订阅模型实现的数据结构以及使用发布订阅模型的场景

发布订阅是一种通信模式,哨兵通过发布订阅来与节点进行交流,发布订阅能够实现关注、订阅系统的实现

发布订阅的两种方式订阅频道、模式是通过维护频道字典和模式链表实现的,其中发送消息会先遍历字典和链表找出匹配频道的订阅客户端进行发送,其他pubsub相关查看订阅信息命令都是从频道字典和模式链表中获取信息

最后(一键三连求求拉~)

本篇文章笔记以及案例被收入 gitee-StudyJavagithub-StudyJava 感兴趣的同学可以stat下持续关注喔\~

有什么问题可以在评论区交流,如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下\~

关注菜菜,分享更多干货,公众号:菜菜的后端私房菜

本文由博客一文多发平台 OpenWrite 发布!
点赞
收藏
评论区
推荐文章
Anthony555 Anthony555
4年前
前端面试系列——Vue面试题
Vue双向绑定原理mvvm双向绑定,采用数据劫持结合发布者订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter、getter,在数据变动时发布消息给订阅者,触发相应的监听回调。双
Stella981 Stella981
4年前
Redis 发布订阅模式(7)
列表的局限前面我们说通过队列的rpush和lpop可以实现消息队列(队尾进队头出),但是消费者需要不停地调用lpop查看List中是否有等待处理的消息(比如写一个while循环)。为了减少通信的消耗,可以sleep()一段时间再消费,但是会有两个问题:1、如果生产者生产消息的速度远大于消费者消费消息的速度,List会占用大量的内存。2、
Stella981 Stella981
4年前
Android面试之EventBus
简介众所周知,EventBus是一款用在Android开发中的发布/订阅事件总线框架,基于观察者模式,将事件的接收者和发送者分开,简化了组件之间的通信操作,使用简单、效率高、体积小!EventBus使用了典型的发布/订阅事件模式,下面是EventBus官方给出的原理示意图。!在这里插入图片描述(https://oscimg.o
Stella981 Stella981
4年前
RabbitMQ之消息发布订阅与信息持久化技术
信息发布与订阅Rabbit的核心组件包含Queue(消息队列)和Exchanges两部分,Exchange的主要部分就是对信息进行路由,通过将消息队列绑定到Exchange上,则可以实现订阅形式的消息发布及Publish/Subscribe在这种模式下消息发布者只需要将信息发布到相应的Exchange中,而Ex
Stella981 Stella981
4年前
Redis是什么
redis是Nosql数据库,是一个keyvalue存储系统。可用于缓存,事件发布或订阅,高速队列等场景。该数据库使用ANSIC语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。虽然redis是keyvalue的存储系统,但是redis支持的value存储类型是非常的多,比如字符串、链表、集合、有序集合和哈希。
Stella981 Stella981
4年前
Redis 发布订阅
Redis发布订阅Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis客户端可以订阅任意数量的频道。下图展示了频道channel1,以及订阅这个频道的三个客户端——client2、client5和client1之间的关系:!(
Stella981 Stella981
4年前
Redis中使用Java代码的方式实现发布订阅流程
场景Redis中的发布与订阅的概念与以命令行的方式实现发布订阅举例:https://blog.csdn.net/BADAO\_LIUMANG\_QIZHI/article/details/105042049(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fblog.csdn
Stella981 Stella981
4年前
Redis常见问题
1、什么是Redis?回答:Redis是一个基于内存的高性能keyvalue数据库;应用场景:1)会话缓存(SessionCache)2)全页缓存(FPC)3)队列4)排行榜/计数器5)发布/订阅2、使用Redis有哪些好处?回答:1)速度快,因为数据存在内存中,类似于HashMap,HashM
Stella981 Stella981
4年前
Redis发布订阅(Pub
一、redis做消息队列1\.redis存储的list数据是双向链表实现的,可以作为队列2\.使用lpush和rpop实现入队和出队3\.每次使用lpush和rpop都要发起一次连接,性能不好4\.这是一次生产,一次消费的队列二、发布/订阅模式(publish/subscribe),也是作为消息队列1\.可以一次生产
Stella981 Stella981
4年前
Redis发布订阅机制
原文:Redis发布订阅机制(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fyitudake%2Fp%2F6747995.html)1\.什么是RedisRedis(https://www.oschina.n
Stella981 Stella981
4年前
Redis发布订阅
简介发布者和订阅者都是Redis客户端。发布者可以发消息到任意多个频道上,订阅者可以订阅任意多个频道。订阅命令subscribe channel\channel...\:返回的数字1,2表示订阅的第n个频道,频道返回的消息类型是message127.0.0.1:6379subscribeeduca
冯诺依曼架构
冯诺依曼架构
Lv1
我行殊未已,何日复归来。
文章
3
粉丝
0
获赞
0