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。

观察者模式:

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

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

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

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

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

相关推荐
Omics Pro5 分钟前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言
JAVA面经实录9171 小时前
Hibernate面试题库
数据库·oracle·hibernate
Mr. zhihao1 小时前
Redis五大高级数据结构:原理-场景-底层-横向对比
数据结构·redis
迷枫7122 小时前
DM8 目录结构与常用排查入口梳理
服务器·数据库
Mr.Daozhi3 小时前
RAG 进阶实战:跑通 Demo 后我连续翻了 6 次车,逐一修复才真正可用(含 Gradio Web 版)
前端·数据库·langchain·大模型·gradio·rag·科研工具
小程故事多_803 小时前
Claude Code自定义workflow skills用法
数据库·人工智能·智能体
大鹏说大话3 小时前
SQL 排序与分组实战:解决“分组后取最新数据“
android·java·数据库
夏贰四3 小时前
数据建模工具如何筑牢数据根基?数据建模工具怎样落实标准体系?
数据库·数学建模·数据建模工具
程序猿阿伟5 小时前
《一套完整方法论:搞定图形应用的Docker镜像优化》
数据库·docker·容器
二等饼干~za8986685 小时前
geo优化源码开发搭建技术分享
大数据·网络·数据库·人工智能·音视频