Redis 发布/订阅介绍

news2024/11/15 21:27:53

目录

​编辑

一、发布与订阅

 6.1 频道

 6.1.1 发布

6.1.2 订阅

 6.1.3 数据结构

 6.1.3.1 订阅(channel)

 6.1.3.2 发布

6.1.3.3 退订

 6.2 模式(pattern)

 6.2.1 发布

 6.2.2 订阅

 6.2.3 数据结构

 6.2.3.1 发布

 6.2.3.2 订阅

 6.2.3.3 退订

 6.3 使用场景

 6.3.1 哨兵间通信

 6.3.2 消息队列


一、发布与订阅

redis发布与订阅是一种消息通信的模式:发送者(pub)发送消息,订阅者(sub)接收消息。

redis通过PUBLISH和SUBSCRIBE等命令实现了订阅与发布模式,这个功能提供两种信息机制,分别是订阅/发布到频道、订阅/发布到模式的客户端。

 6.1 频道

 6.1.1 发布

发布者发布消息

发布者向频道channel:1发布消息hi

127.0.0.1:6379> publish channel:1 hi
(integer) 1

6.1.2 订阅

 

订阅者订阅消息

127.0.0.1:6379> subscribe channel:1
Reading messages... (press Ctrl-C to quit)
1) "subscribe" // 消息类型
2) "channel:1" // 频道
3) "hi" // 消息内容

执行subscribe后客户端会进入订阅状态,仅可以使subscribe、unsubscribe、psubscribe和punsubscribe这四个属于"发布/订阅"之外的命令

订阅频道后的客户端可能会收到三种消息类型

  • subscribe。表示订阅成功的反馈信息。第二个值是订阅成功的频道名称,第三个是当前客户端订阅的频道数量。
  • message。表示接收到的消息,第二个值表示产生消息的频道名称,第三个值是消息的内容。
  • unsubscribe。表示成功取消订阅某个频道。第二个值是对应的频道名称,第三个值是当前客户端订阅的频道数量,当此值为0时客户端会退出订阅状态,之后就可以执行其他非"发布/订阅"模式的命令了。

 6.1.3 数据结构

基于频道的发布订阅模式是通过字典数据类型实现的

struct redisServer {
    // ...
    dict *pubsub_channels;
    // ...
};

其中,字典的键为正在被订阅的频道, 而字典的值则是一个链表, 链表中保存了所有订阅这个频道的客户端。

 

 6.1.3.1 订阅(channel)

当使用subscribe订阅时,在字典中找到频道key(如没有则创建),并将订阅的client关联在链表后面。

当client 10执行subscribe channel1 channel2 channel3时,会将client 10分别加到 channel1 channel2 channel3关联的链表尾部。

 6.1.3.2 发布

发布时,根据key,找到字典汇总key的地址,然后将msg发送到关联的链表每一台机器。

6.1.3.3 退订

遍历关联的链表,将指定的地址删除即可。

 

 6.2 模式(pattern)

pattern使用了通配符的方式来订阅

通配符中?表示1个占位符,*表示任意个占位符(包括0),?*表示1个以上占位符。

所以当使用 publish命令发送信息到某个频道时, 不仅所有订阅该频道的客户端会收到信息, 如果有某个/某些模式和这个频道匹配的话, 那么所有订阅这个/这些频道的客户端也同样会收到信息。

 6.2.1 发布

发布者发布消息

127.0.0.1:6379> publish b m1
(integer) 1
127.0.0.1:6379> publish b1 m1
(integer) 1
127.0.0.1:6379> publish b11 m1
(integer) 1

 6.2.2 订阅

订阅者订阅消息

127.0.0.1:6379> psubscribe b*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "b*"
3) (integer) 3
1) "pmessage"
2) "b*"
3) "b"
4) "m1"
1) "pmessage"
2) "b*"
3) "b1"
4) "m1"
1) "pmessage"
2) "b*"
3) "b11"
4) "m1"

 

 6.2.3 数据结构

pattern属性是一个链表,链表中保存着所有和模式相关的信息。

struct redisServer {
    // ...
    list *pubsub_patterns;
    // ...
};
// 链表中的每一个节点结构如下,保存着客户端与模式信息
typedef struct pubsubPattern {
    redisClient *client;
    robj *pattern;
} pubsubPattern;

 

 6.2.3.1 发布

当发布者发布消息时,首先会发送到对应的频道上,在遍历模式列表,根据key匹配模式,匹配成功将消息发给对应的订阅者。

完成的发布伪代码如下:

def PUBLISH(channel, message):
    # 遍历所有订阅频道 channel 的客户端
    for client in server.pubsub_channels[channel]:
        # 将信息发送给它们
        send_message(client, message)
    # 取出所有模式,以及订阅模式的客户端
    for pattern, client in server.pubsub_patterns:
        # 如果 channel 和模式匹配
        if match(channel, pattern):
            # 那么也将信息发给订阅这个模式的客户端
            send_message(client, message)

 6.2.3.2 订阅

当有信的订阅时,会将订阅的客户端和模式信息添加到链表后面。

 

 6.2.3.3 退订

使用punsubscribe,可以将订阅者退订,将改客户端移除出链表。

 6.3 使用场景

 6.3.1 哨兵间通信

哨兵集群中,每个哨兵节点利用 Pub/Sub 发布订阅实现哨兵之间的相互发现彼此和找到 Slave。

哨兵与 Master 建立通信后,利用 master 提供发布/订阅机制在 `__sentinel__:hello`发布自己的信息,同时订阅这个频道来获取其他哨兵的信息,就这样实现哨兵间通信。

 6.3.2 消息队列

我们也可以利用 Redis 发布订阅实现 轻量级简单的 MQ 功能 ,实现上下游解耦,需要注意点是 Redis 发布订阅的消息不会被持久化,所以新订阅的客户端将收不到历史消息。

也不支持 ACK 机制,所以当前业务不能容忍这些缺点,那就使用专业的消息队列,如果能容忍那就能享受 Redis 快带来的优势。

好了,今天关于Redis发布/订阅的内容就分享到这里,如果觉得对您有帮助,欢迎点赞+收藏+关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/706380.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

登录远程Linux桌面

远程桌面连接主要使用两种协议,一种是Windows上RDP协议,第二种是VNC协议,从使用效果来看,vnc更优秀。 一、VNC 使用x11vnc 1.安装x11vnc sudo apt install x11vnc 2.启动x11vnc x11vnc -passwd orangepi -display :0 -forever…

【线程池】ScheduledExecutorService接口和ScheduledThreadPoolExecutor定时任务线程池使用详解

目录 〇、简介 0.1 ScheduledExecutorService 和 Timer 的区别 一、什么是ScheduledExecutorService? 二、ScheduledThreadPoolExecutor中的方法 2.1 构造方法 2.2 schedule方法 2.3 scheduleAtFixedRate方法 2.4 scheduleWithFixedDelay方法 2.5 setConti…

什么是组件,以及前端各种框架组件的使用方法

🙂博主:小猫娃来啦 🙂文章核心:介绍什么是组件,以及前端各种框架组件的使用方法 目录 什么是组件,请细看关键点 前端常用框架vue2框架的常用组件库vue3框架的常用组件库react框架的常用组件库微信小程序常用…

智能三路CAN总线集线器解决CAN总线集线问题

随着科技的发展,CAN总线通讯再各行各业中应用,再不同的应用中,需要把两路CAN集合到一起,或者把一路CAN分为两路,这时候就需要CAN总线集线器来解决。 CANbridge-300每一路CAN通道都具有数据存储转发至另两路CAN通道的功…

Java——《面试题——分布式篇》

前文 java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 Java——《面试题——MySQL篇》​​​​​​ Java——《面试题——SpringCloud》 Java…

SQL查询语句语法结构和运行顺序

语法结构:select–from–where–group by–having–order by–limit 运行顺序:from–where–group by–having–order by–limit–select

【Vue3】学习笔记-生命周期

Vue2.x与vue3生命周期 Vue3.0中可以继续使用Vue2.x中的生命周期钩子,但有有两个被更名: beforeDestroy改名为 beforeUnmountdestroyed改名为 unmounted Vue3.0也提供了 Composition API 形式的生命周期钩子,与Vue2.x中钩子对应关系如下&#…

只用一次集合遍历实现树形结构,非递归方式

一般情况下,我们想要实现这种无限层级的树形结构,都是采用递归的方式,但是递归比较占用内存,也容易导致栈溢出,于是只能尝试其它的方法。 下面采用的方式,只需要一次集合的遍历就可以实现树形的结构。 先手…

Spring Boot 中的 @RabbitListener 注解是什么,原理,如何使用

Spring Boot 中的 RabbitListener 注解是什么,原理,如何使用 在 RabbitMQ 中,消息的接收需要通过监听队列来实现。在 Spring Boot 应用程序中,可以使用 RabbitListener 注解来监听队列,并在接收到消息时执行指定的方法…

Java实现OpenAI模型训练

本文章介绍如何用java实现OpenAI模型训练,仅供参考 提前准备工作 OpenAI KEY,获取方式可自行百度需要自备VPN 或 使用国外服务器转发需要训练的数据集,文章格式要求为JSONL,格式内容详见下图(尽量不要低于500个问答&…

消息模块的数据模型设计

目录 一、创建POJO映射类 1. message集合 2. message_ref集合 二、MongoDB的联合查询 MessageRef:保存消息接收人相关信息,接收人ID、消息已读未读、消息是否最新接收。 在 MongoDB 里面我们不需要预先去创建集合,只要我们往 MongoDB 里…

Linux常用命令——finger命令

在线Linux命令查询工具 finger 用于查找并显示用户信息 补充说明 finger命令用于查找并显示用户信息。包括本地与远端主机的用户皆可,帐号名称没有大小写的差别。单独执行finger指令,它会显示本地主机现在所有的用户的登陆信息,包括帐号名…

Layout-静态模板结构搭建、字体图标引入、一级导航渲染、吸顶导航交互实现、Pinia优化重复请求【小兔鲜Vue3】

Layout-静态模板结构搭建 Layout模块静态模板搭建 LayoutNav.vue <script setup></script><template><nav class"app-topnav"><div class"container"><ul><template v-if"true"><li><a h…

鲸鱼算法WOA优化VMD参数,最小包络熵、样本熵、信息熵、排列熵(适应度函数可自行选择,一键修改)包含MATLAB源代码...

鲸鱼优化算法(Whale optimization algorithm, WOA)是Mirjalili根据座头鲸的捕食行为而提出来的&#xff0c;算法对座头鲸的狩猎行为进行模仿&#xff0c;通过对猎物的寻找&#xff0c;然后攻击进行觅食&#xff0c;以此来达到优化的目的&#xff0c;已有很多学者将算法用于实际…

【C/C++实现进程间通信 二】消息队列

文章目录 前情回顾思路源码Publisher.cppSubscriber.cpp 效果 前情回顾 上一期已经讲解过了进程的相关概念以及进程间通信的实现原理&#xff0c;下面仅展示消息传递机制实现1进程间通信的相关代码。 思路 /*本项目主要用于以消息传递机制的方式进行进程间通信的测试。1.主要…

很荣幸与屈晗煜在 GitLink 编程夏令营(GLCC)活动中协作

作为一名软件工程师&#xff0c;天然有着追求代码质量的执念。相信很多人对代码的优雅、质量有着自己的认识&#xff0c;业界也有不少的共识&#xff0c;其中有一条我认为是非常重要的——代码可测试。 作为一名研发&#xff0c;只关注功能可测&#xff08;容易测&#xff09;是…

BUUCTF old-fashion 1

题目描述&#xff1a; 密文&#xff1a; Os drnuzearyuwn, y jtkjzoztzoes douwlr oj y ilzwex eq lsdexosa kn pwodw tsozj eq ufyoszlbz yrl rlufydlx pozw douwlrzlbz, ydderxosa ze y rlatfyr jnjzli; mjy gfbmw vla xy wbfnsy symmyew (mjy vrwm qrvvrf), hlbew rd symmy…

多元回归预测 | Matlab基于鲸鱼算法(WOA)优化混合核极限学习机HKELM回归预测, WOA-HKELM数据回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于鲸鱼算法(WOA)优化混合核极限学习机HKELM回归预测, WOA-HKELM数据回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 …

【软考程序员学习笔记】——数据结构与算法基础

目录 &#x1f34a;一、数据结构概念和分类 &#x1f34a;二、数组特点&存储方式 &#x1f34a;三、矩阵 特殊矩阵 非特殊矩阵 &#x1f34a;四、栈和队列 &#x1f34a; 五、二叉树的性质 &#x1f34a;六、二叉树的遍历 (1)前序遍历(先根遍历&#xff0c;先序遍历…

《MySQL》什么是数据库

文章目录 数据库的理解MySQL的架构SQL语句分类存储引擎 数据库的理解 我们所下的数据库软件(如MySQL)其实是中间件。如何理解呢&#xff0c;如图&#xff1a; 我们用户通过MySQL对数据进行管理。 mysql #客户端程序 mysqld #服务端程序&#xff0c;再修改配置后需要重新启动…