【Redis笔记】发布与订阅

2023-11-04

Redis发布与订阅功能由PUBLISH,SUBSCRIBE,PSUBSCRIBE等命令组成。

【SUBSCRIBE命令】

客户端可以订阅一个或多个频道,从而成为这些频道的订阅者(subscriber)。

每当有其他客户端向被订阅的频道发送消息时,频道的所有订阅者都会收到这条消息。

 

【实现】

Redis所有频道的订阅关系都保存在服务器状态的pubsub_channels字典里面,这个字典的键是某个被订阅的频道,值是一个链表,记录了所有订阅这个频道的客户端。

每当客户端执行SUBSCRIBE命令订阅某个或某些频道时,服务器都会将客户端与被订阅的频道与pubsub_channels字典进行关联。

如果频道有订阅者,把客户端加到订阅者链表的末尾。

如果频道没有订阅者,新建一个链表,把客户端加到链表,称为链表第一个元素。

【UNSUBSCRIBE命令】

客户端退订某个或某些频道。

服务器将从pubsub_channels中解除客户端与被退订频道之间的关联。

程序会根据被退订频道的名字,在pubsub_channels字典中找到频道对应的订阅者链表,然后从订阅者链表中删除退订客户端信息。

如果删除退订客户端之后,频道的订阅者链表变成了空链表,那么说明这个频道已经没有任何订阅者了,程序将从pubsub_channels字典中删除频道对应的键。

【PSUBSCRIBE命令】

客户端可以订阅一个或多个模式,从而成为这些模式的订阅者。

每当有其他客户端向某个频道发送消息时,消息不仅会被发送给这个频道的所有订阅者,还会被发送给所有与这个频道相匹配的订阅者。

 

 

【实现】

服务器将所有模式的订阅关系保存在服务器状态的pubsub_patterns属性里面。

pubsub_patterns属性是一个链表,链表中的每一个节点都包含了一个pubsubPattern结构,这个结构的pattern属性记录了被订阅的模式,client属性记录了订阅模式的客户端。

每当客户端执行PSUBSCRIBE命令订阅某个或某些模式的时候

服务器会

(1)新建一个pubsubPattern结构,将结构的pattern属性设置为被订阅的模式,client属性设置为订阅模式的客户端。

(2)将pubsubPattern结构添加到pubsub_patterns链表的末尾。

 

【PUNSUBSCRIBE命令】

当一个客户端退订某个或某些模式时,服务器会在pubsub_patterns链表中查找并删除pattern和client属性都匹配的节点,

【PUBLISH命令】

将消息message发送给channel频道的所有订阅者

如果有一个或多个模式pattern与模式channel相匹配,那么将消息message发送给pattern模式的订阅者。(遍历链表并判断)

【查看订阅信息】

【PUBSUB CHANNELS】返回服务器当前被订阅的频道。

可选参数pattern。

如果没有pattern参数,命令返回服务器当前被订阅的所有频道。

如果有pattern参数,命令返回服务器当前被订阅的频道中与pattern模式相匹配的频道。

实现:遍历pubsub_channels字典的所有键

【PUBSUB NUMSUB】接受任意多个频道作为参数,并返回这些频道的订阅者数量

实现:返回订阅者链表的长度

【PUBSUB NUMPAT】返回服务器当前被订阅模式的数量

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Redis笔记】发布与订阅 的相关文章

随机推荐

  • C语言枚举类型的大小

    主流编译器如 gcc vc MinGW gcc等枚举变量均为4字节 少量编译器会根据枚举个数做优化 如只有3个枚举值时 size可能为1 enum长度不确定会带来可移植性问题 如果第三方库API接口使用enum类型 编译和调用库时一旦有关e
  • c++读取TXT文件内容

    c 读取TXT文件内容 首先添加头文件 include
  • Cron expression must consist of 6 fields

    corn 表达式为 Scheduled cron 20 2021 运行代码提示报错 Cron 表达式必须包含 6 个字段 Cron expression must consist of 6 fields found 7 in 20 2021
  • 光盘装系统和U盘装系统有什么区别?哪个好?

    光盘装系统和U盘装系统的区别 U盘 U盘安装就是利用U盘启动盘制作工具 制作U盘启动盘 之后从U盘启动WIN PE 系统 再加载下载好的系统镜像进行安装的方法 光盘 光盘安装法就是利用购买好的系统盘 或者自己制作的系统盘 利用电脑的光驱 直
  • Uni-app登录态管理(vuex)

    转载 https www cnblogs com edward life p 11181139 html 应用中 保持登录状态是常见需求 本文讲解使用uni app框架时如何保持用户登录状态 即 初次进入应用为未登录状态 gt 登录 gt
  • html提交表单 node,Nodejs之http的表单提交

    之前介绍了http模块的请求与响应的过程 也介绍了TCP协议的客户端与服务端的数据传输 http协议是TCP上层协议 这里创建了一个简单的web服务器 并对提交表单数据进行处理 根据了不起的Node js一书总结 POST方法提交表单数据
  • centso7 openssl 报错Verify return code: 20 (unable to get local issuer certificate)

    问题重现 由于centos7 默认的openssl的版本为1 1 0k 本人编译媒体服务时 需要openssl版本1 1 1以上 所有删除的之前的低版本openssl 手动编译了一个1 1 1k的版本 媒体服务正常运行 并且CA验证正常 结
  • hadoop完全分布式一键安装、启动、停止脚本

    hadoop完全分布式一键安装脚本 bin bash 配置HADOOP的安装目录 修改的地方1 脚本可以自己创建 在windows编写的代码可能运行有问题执行以下 1 gt vim redisshell sh 2 gt set ff uni
  • 1.使用SQL语句创建表

    1 创建表的语法 create table 表名 列1 数据类型 1 列2 数据类型 tablespace 表空间 SQL create table student ID NUMBER not null NAME VARCHAR2 20 表
  • 综合能力 ---- 1. 通信职业道德

    1 职业道德内涵 职业义务 职业良心 职业荣誉 职业信誉 职业尊严 职业纪律 2 记忆职业和职业道德概念 职业 人们在社会中所从事的专门业务和对社会所承担的特定职责 并以此作为重要生活来源的社会活动 职业道德 人们从事正当的社会职业 并在其
  • chrome.runtime.sendMessage 回调函数参数为undefined

    chrome runtime sendMessage 回调函数参数为undefined chrome runtime sendMessage的回调函数默认是同步的 而且超时后直接执行 返回undefined 如果要异步执行 必须在处理函数中
  • Vim,人类史上最好用的文本编辑器!从此以后你就是一个善良的极客!

    CSDN 的小伙伴们 大家好 我是沉默王二 写完 Shell 那篇后就想写 Vim 了 因为人类史上最好的文本编辑器就是 Vim 不赞同的请自觉持有保留意见 哈哈哈 Better Stronger Faster 用这三个单词来赞美 Vim
  • iOS(三)实现App底部TabBar的切换:二

    上一篇讲述了iOS自带的TabBar 但在我所见到的很多App源码中大多用了自己写的TabBar 惯例先上图 这只是一个最简单的TabBar 但重在原理 虽然是我懒 HomeViewController h HomeViewControll
  • day17-json和面向对象(总结)

    day17 json和面向对象 姚万里 1 json数据 1 json数据格式的作用 json和xml是两种通用的数据格式 几乎所有的高级编程语言都支持 json和xml数据的格式的存在 是为了让不同编程语言的程序可以进行有效的数据沟通 2
  • VSCode: PlatformIO主页一直显示loading解决方案

    VSCode PlatformIO主页一直显示loading解决方案 Github问题描述 Could not start PIO Home server Error timeout 205 在vscode中打开platformio点击进入
  • 海豚php上传音频方法(引用 layui的 js 与 css)

    1 html代码 div class layui upload div div div
  • 1033. 旧键盘打字(20)--Python

    之前的时候最后一个测试点一直没有通过 后来在网上搜寻了一下答案 发现自己写的逻辑实在是太混乱了 所以看了一下别人的思路 主要是 1 首先判断坏键盘中是否有 若是有的话 使用flag标记一下 2 然后可以循环的判断应该输出的字符串 边遍历边输
  • 遗传算法及Python代码实现、图解

    目录 前言 一 遗传算法 Genetic Algorithm GA 简介 二 遗传算法基本概念 二 1 目标函数 环境 二 2 一组解 最优解 种群 最适宜种群 二 3 解 编码 个体 基因型 二 4 解码 表现型 难点 二 5 交叉 变异
  • 【jdk1.8特性】之Function

    笔者日常 来吧 Function 相关声明 本文按照以下顺序进行说明并给出简单的使用示例 序号 接口 1 Function
  • 【Redis笔记】发布与订阅

    Redis发布与订阅功能由PUBLISH SUBSCRIBE PSUBSCRIBE等命令组成 SUBSCRIBE命令 客户端可以订阅一个或多个频道 从而成为这些频道的订阅者 subscriber 每当有其他客户端向被订阅的频道发送消息时 频