Redis ——发布订阅

问题引入:

服务器A、B、C、D,客户端:C1,C2,C3,C4;

客户端基于集群聊天服务器的负载均衡分配;

C1 被分配到A,C2 被分配到B,C3 被分配到C,C4 被分配到D;

C1->C3; C3->C1;

C2->C3; C4->C1;

跨服务器间的消息通信问题,使用Redis 发布订阅,

则无需多服务器强连接(服务器机数量*(服务器机器数量-1)次连接,且不便于服务器扩展)浪费资源;

底层结构:

发布订阅:基于哈希表链表结构实现

map结构key值保存用户订阅的兴趣事件,而value保存发布者对象信息,以链表的形式连接对同一事件感兴趣的对象,当消息队列中出现关于订阅事件的发布信息时,Redis可以快速的将该信息按照以key值对应的value链表为订阅的转发顺序;

基于上述情况:

服务器A、服务器B将订阅(SUBSCRIBE) C3 事件;

服务器C、服务器D将订阅(SUBSCRIBE) C1事件;

**订阅:**Redis 在内部map结构中查找订阅事件,找到则将订阅对象加入链表序列,否则创建该key值,并将服务器加入value链表

eg: 服务器A 订阅C3 对象的事件,Redis先在Map结构查找C3事件是否存在,不存在创建C3 为key,并将服务器A 插入value中的链表结构

发布:

当某服务器在Redis消息队列中发布(PUBLISH)事件时,Redis将在map结构中找到订阅该事件对应的服务器链表,进行转发。

eg:当消息队列中由服务器发布关于C1 事件,Redis 查找C1为key对应的value 链表,并将C1事件转发给链表中的服务器C、服务器B。

观察者模式:

定义一种(被观察类)对多(观察类)的关系,让多个观察对象同时监听一个被观察对象,被观察 对象状态发⽣变化时,会通知所有的观察对象,使他们能够更新自己的状态。

观察者模式中存在两种角色:

观察者:内部包含被观察者对象,当被观察者对象的状态发⽣变化时,更新状态。

接收通知更新状态->被观察者:内部包含了所有观察者对象,当状态发生变化时通知所有的观察者更新自己的状态。

场景: 当⼀个对象的改变需要同时改变其他对象,且不知道具体有多少对象有待改变时,应该考虑观察者模式; 一个抽象模型其中一方面依赖于另一方面,这时以观察者模式将这两者封装在独立的对象中使它们各自地改变和复用

相关推荐
心平气和量大福大7 分钟前
android-实例2-数据库sqlite(查询)
android·数据库·sqlite
海兰8 分钟前
【数据库】告别数据库性能噩梦,拥抱 UUID v7
数据库
linweidong13 分钟前
字节AI Agent面试题大全及参考答案(下)
数据库·oracle
枫彩20 分钟前
WorkBuddy 做A股自动复盘实战:数据校验、工具调用与定时报告
大数据·网络·数据库·a股·mcp·workbuddy
其实防守也摸鱼30 分钟前
CTF 入门到进阶:Web、逆向、密码学与 Pwn 实战解题指南
数据库·安全·自动化·github·copilot
晓子文集30 分钟前
Tushare接口文档:每日停复牌信息(suspend_d)
大数据·数据库·金融·金融数据·量化投资
SamChan901 小时前
用PostgreSQL+pgvector构建PDF翻译记忆库:向量相似度检索+增量更新实战
数据库·python·ai·postgresql·pdf·wpf
裕晟资质规划1 小时前
首次办理军工保密资质:咨询服务选择要点与全流程交付清单(评估框架)
大数据·运维·服务器·网络·数据库·经验分享
Data_Journal9 小时前
用于网页抓取的 Node-unblocker
大数据·开发语言·数据库·python·scrapy
涤生大数据9 小时前
一次“没有运行日志”的DolphinScheduler任务失败排查
大数据·数据库·人工智能·状态模式