Redis中的订阅发布(三)

订阅发布

发送消息

当一个Redis客户端执行PUBLISH 命令将消息message发送给频道channel的时候,服务器需要执行以下
两个动作:

  • 1.将消息message发送给channel频道的所有订阅者
  • 2.如果一个或多个模式pattern与频道channel相匹配,那么将消息message发送给pattern模式的订阅者

将消息发送给频道订阅者

因为服务器状态中的pubsub_channels字典记录了所有频道的订阅关系,所以为了将消息发送给channel频道的所有订阅者,PUBLISH命令要做的就是在pubsub_channels字典里找到频道channel的订阅者名单(一个链表),
然后将消息发送给名单上的所有客户端

例子
  • 举个例子。假设服务器pubsub_channels字典当前的状态如图所示,
    如果这时某个客户端执行命令
PUBLISH "news.it" "hello"

那么PUBLISH命令将在pubsub_channels字典中查找键"news.it"对应的链表值,并通过遍历链表将消息"hello"发送给"news.it"频道的三个订阅者:client-1、client-2、client-3
在这里插入图片描述

PUBLISH命令实现

将消息发送给频道订阅者的方法可以用以下伪代码来描述:

def channel_publish(channel, message):
# 如果channel键不存在于pubsub_channels字典中
# 那么说明channel频道没有任何订阅者
# 程序不做发送动作,直接返回
if channel not in server.pubsub_channels:
return# 运行到这里,说明channel频道至少有一个订阅者
# 程序遍历channel频道的订阅者链表
# 将消息发送给所有订阅者
for subscriber in server.pubsub_channels[channel]:
send_message(subscriber, message)

将消息发送给模式订阅者

因为服务器状态中的pubsub_patterns链表记录了所有模式的订阅关系,所以为了将消息发送给所有与channel频道相匹配的模式的订阅者,PUBLISH命令要做的就是遍历整个pubsub_patterns链表,查找那些与channel频道相匹配的模式,并将消息发送给订阅了这些模式的客户端。

例子
  • 举个例子。假设pubsub_patterns链表的当前状态如图所示。
    如果这时客户端执行命令
PUBLISH "news.it" "hello"

那么PUBLISH命令会首先将消息"hello"发送给"news.it"频道的所有订阅者,然后开始在pubsub_patterns链表中查找是否有被订阅的模式与"news.it"频道相匹配,结果发现"news.it"频道和客户端client-9订阅的"news.*"频道匹配,于是命令将消息"hello"发送给客户端client-9
在这里插入图片描述

PUBLISH命令

将消息发送给模式订阅者的方法可以用以下伪代码来描述:

def pattern_publish(channel, message):
# 遍历所有模式订阅消息
for pubsubPattern in server.pubsub_patterns:
# 如果频道和模式相匹配
if match(channel, pubsubPattern.pattern):
# 那么将消息发送给订阅该模式的客户端
send_message(pubsubPattern.client, message)

最后,PUBLISH命令的实现可以用以下伪代码来描述:

def publish(channel, message):
# 将消息发送给channel频道的所有订阅者
channel_publish(channel, message)# 将消息发送给所有和channel频道相匹配的模式的订阅者
pattern_publish(channel, message)

查看订阅信息

PUBSUB命令是Redis2.8新增加的命令之一,客户端可以通过这个命令来查看频道或者模式的相关信息,比如某个频道目前有多少订阅者,
又或者某个模式目前有多少订阅者,诸如此类

PUBSUB CHANNELS

PUBSUB CHANNELS [pattern]子命令用于返回服务器当前被订阅的频道,其中pattern参数是可选的:

  • 1.如果不给顶patter参数,那么命令返回服务器当前被订阅的所有频道
  • 2.如果给定pattern参数,那么命令返回服务器当前被订阅的频道中那些与pattern模式相匹配的频道这个子命令是通过遍历服务器pubsub_channels字典的所有键(每个键都是一个被订阅的频道),然后记录
    并返回所有符合条件的频道来实现额,这个过程可以用以下伪代码来描述
def pubsub_channels(pattern=None):
# 一个列表,用于记录所有符合条件的频道
channel_list = []# 遍历服务器中的所有频道
# (也即是pubsub_channels字典的所有键)
for channel in server.pubsub_channels:
# 当以下两个条件的任意一个满足时,将频道添加到链表里面
# 1.用户没有指定pattern参数
# 2.用户指定了pattern参数,并且channel和pattern匹配
if (patter is None) or match (channel, pattern):
channel_list.append(channel)# 向客户端返回频道列表
return channel_list

例子

  • 举个例子。对于图中所示的pubsub_channels字典来说,执行PUBSUB CHANNELS命令将返回服务器目前订阅的四个频道:
1."news.it"
2."news.sport"
3."news.business"
4."news.movie"

另一方面,执行PUBSUB CHANNELS "news.[is]"命令将返回"news.it"和"news.sport"两个频道,因为只有这两个频道和"news[is]"模式相匹配

1."news.it"
2."news.sport"

在这里插入图片描述

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

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

相关文章

PyPDF2,一个超实用的 Python 库!

更多Python学习内容:ipengtao.com 大家好,今天为大家分享一个超实用的 Python 库 - pypdf。 Github地址:https://github.com/py-pdf/pypdf PDF(Portable Document Format)是一种广泛用于文档传输和打印的文件格式&…

Hive概述与基本操作

一、Hive基本概念 1.什么是hive? (1)hive是数据仓库建模的工具之一 (2)可以向hive传入一条交互式的sql,在海量数据中查询分析得到结果的平台 2.Hive简介 Hive本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS…

Anaconda安装与pycharm配置

一、安装 Anaconda超详细安装教程(Windows环境下) Anaconda和Pycharm超详细安装教程 二、问题 解决CondaHTTPError: HTTP 000 CONNECTION 问题

【翻译】再见, Clean Code!

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 【翻译】再见, Clean Code!正文那是一个深夜次日早晨这只是一个阶段 【翻译】再见…

var cannot be resolved to a type

var cannot be resolved to a type var 是JDK10的产物吧。真的是够懒的人,一个var自动转换类型。 高版本的功能又要放到低版本的平台系统中,【集成】,向下兼容天天改这些。

2024年山东三支一扶考试报名照片要求

2024年山东三支一扶考试报名照片要求

[大模型]internLM-Chat-7B FastApi 部署调用

internLM-Chat-7B FastApi 部署调用 环境准备 在autodl平台中租一个3090等24G显存的显卡机器,如下图所示镜像选择PyTorch–>1.11.0–>3.8(ubuntu20.04)–>11.3 接下来打开刚刚租用服务器的JupyterLab,并且打开其中的终端开始环境配置、模型下…

Github 2024-04-16Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目1Vue项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次…

[spring] Spring Boot REST API - 项目实现

Spring Boot REST API - 项目实现 书接上文 Spring Boot REST API - CRUD 操作,一些和数据库相关联的注解在 [spring] spring jpa - hibernate CRUD 主要的 layer 如下: #mermaid-svg-QE1PR1gyrkz4XIT0 {font-family:"trebuchet ms",verdana…

测试开发面经(二)

测试部分 1.测试计划书中要包含的内容 (1)目的与范围 (2)规程 (3)测试方案与方法 (4)测试的准入准出 (5)测试的计划(流程、时间安排、…

el-date-picker限制只能选择当前时间前/后的时间(包含日期、时、分)

限制只能选择当前时间前/后的时间&#xff08;包含日期、时、分&#xff09; 首先需要给添加一个属性picker-options属性,然后在data中定义这个pickerOptions属性。 <el-date-pickerv-model"saveForm.startTime":picker-options"pickerOptions"format…

[Linux][基础IO][二][缓冲区][理解文件系统]详细解读

目录 1.缓冲区0.缓冲区的刷新策略1.何为缓冲区&#xff1f;2.总结 2.理解文件系统0.文件元数据1.了解文件系统 --> 理解inode2.软硬链接 1.缓冲区 0.缓冲区的刷新策略 一般情况 立即刷新行刷新(行缓冲)满刷新(全缓冲) 特殊情况 用户强制刷新(fflush)进程退出 所有的设备&a…

C#使用Smtp协议发送邮件

使用Smtp协议发送邮件 发送代码&#xff0c;Mail类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Mail; using System.Security.Cryptography.X509Certificates; using System.Net.Security;…

conda配置多版本python

安装conda 以下任选下载 Anaconda Miniconda 配置conda环境变量 比如windows&#xff0c;在配置我的电脑中的环境变量&#xff0c;在系统变量的Path中新增下面内容 需要根据实际目录进行更改 D:\soft\miniconda3 D:\soft\miniconda3\Scripts D:\soft\miniconda3\Library\bi…

MongoDB学习【二】MongoDB数据模型

MongoDB基本数据类型 1. ObjectId {"_id": ObjectId("5f7c45a9bcdd4e00018b4567") }2. 字符串(String) {"name": "John Doe","email": "john.doeexample.com" }3. 数值(Number) {"age": 30,"s…

Java的Future机制详解

Java的Future机制详解 一、为什么出现Future机制二、Future的相关类图2.1 Future 接口2.2 FutureTask 类 三、FutureTask的使用方法四、FutureTask源码分析4.1 state字段4.2 其他变量4.4 构造函数4.5 run方法及其他 一、为什么出现Future机制 常见的两种创建线程的方式。一种是…

Python进阶编程 --- 2.MySQL、pymysql、PySpark

文章目录 第一章&#xff1a;SQL基础入门1.1 数据库数据库如何存储数据 1.2 数据库和SQL的关系1.3 MySQL版本1.4 命令提示符内使用MySQL1.5 SQL概述1.5.1 SQL语言分类1.5.2 SQL语言特性 1.6 DDL库管理表管理 1.7 DML - 数据操作1.8 DQL - 查询和计算数据1.8.1 基础数据查询1.8.…

HDFS Lease详解

本文主要介绍hdfs lease的设计以及实现。 写在前面 https://www.cnblogs.com/jhcelue/p/6783076.html https://blog.csdn.net/yexiguafu/article/details/118890014 https://www.jianshu.com/p/33e1a5a2b876 https://blog.csdn.net/breakout_alex/article/details/1014569…

行业模板|DataEase批发零售大屏模板推荐

DataEase开源数据可视化分析平台于2022年6月发布模板市场&#xff08;https://templates-de.fit2cloud.com&#xff09;&#xff0c;并于2024年1月新增适用于DataEase v2版本的模板分类。模板市场旨在为DataEase用户提供专业、美观、拿来即用的大屏模板&#xff0c;方便用户根据…

LeetCode-热题100:75. 颜色分类

题目描述 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sort 函数的…