深入浅出Redis(九):Redis的发布订阅模式

引言

Redis是一款基于内存的键值对数据库,提供了多种数据结构存储数据,存取数据的速度还非常快,除了这些优点它还提供了其他特色功能,比如:管道、lua脚本、发布订阅模型

本篇文章主要描述发布订阅模型,将围绕发布订阅深入浅出的描述发布订阅的使用和数据结构实现原理

发布订阅

发布订阅是一种消息通信模式

发送者(pub)发送消息到频道(channel),订阅者(sub)接收频道的消息

其中发送者、订阅者都是客户端,频道维护在服务端

Redis提供订阅频道、模式两种方式,模式可以理解为匹配正则的频道 (比如 new.it 匹配 new.*模式)

image.png

使用命令

subscribe channel...订阅一个或多个频道

unsubscribe channel...退订一个或多个频道

psubscribe pattern...订阅一个或多个符合模式的频道 (比如 new.it 符合new.*模式)

publish channel message将消息发送到指定频道

pubsub subcommand argument...查看订阅与发布系统状态

punsubscribe pattern...退订所有给定模式的频道

使用

 #testchannel为频道 hello!caicai为消息#客户端A发送消息 返回0 表示0个客户端接收 此时还没订阅频道   127.0.0.1:6379> publish testchannel hello!caicai(integer) 0​#客户端B订阅testchannel频道127.0.0.1:6379> subscribe testchannelReading messages... (press Ctrl-C to quit)1) "subscribe"2) "testchannel"3) (integer) 1​#客户端A发送消息 返回1 说明1个客户端接收到 127.0.0.1:6379> publish testchannel hello!caicai(integer) 1​#客户端B收到消息1) "message"2) "testchannel"3) "hello!caicai"​#客户端C使用模式进行订阅 订阅符合test*模式的频道(*为通配) testchannel符合test*127.0.0.1:6379> psubscribe test*Reading messages... (press Ctrl-C to quit)1) "psubscribe"2) "test*"3) (integer) 1​#客户端A发送消息 返回2 说明2个客户端接收到 127.0.0.1:6379> publish testchannel hello!caicai2(integer) 2​#客户端B显示1) "message"2) "testchannel"3) "hello!caicai2"​#客户端C显示1) "pmessage"2) "test*"3) "testchannel"4) "hello!caicai2"

原理

subscribe channel 订阅频道维护字典,K为频道,V为链表,节点为订阅频道的客户端;客户端订阅或退订频道则是在字典中添加/删除

psubscribe pattern 订阅模式维护链表,节点为模式名与客户端;客户端订阅或退订模式频道则是在链表上遍历添加/删除

publish 发送消息时,先找到字典中的K频道遍历链表发送消息,再去模式中的链表上遍历频道是否与节点上的模式名匹配,匹配则发送消息给对应客户端

  • pubsub查看订阅信息则是通过字典和链表获取到信息

    • pubsub channels (pattern)则是找到字典中的频道返回链表长度表示这个频道的订阅数量,如果携带了pattern则返回满足匹配的频道
    • pubsub numsub channels 返回字典中频道对应的链表长度
    • pubsub numpat pattern模式数量,返回模式链表长度

通过发布订阅模型能够实现订阅、通知系统,哨兵模式中也使用发布订阅模式,哨兵订阅主节点,主节点收到某个哨兵命令后发布返回信息,各个哨兵收到消息后能够感知其他哨兵的存在

总结

本文围绕Redis的发布订阅模型,深入浅出描述了发布订阅模型的使用、发布订阅模型实现的数据结构以及使用发布订阅模型的场景

发布订阅是一种通信模式,哨兵通过发布订阅来与节点进行交流,发布订阅能够实现关注、订阅系统的实现

发布订阅的两种方式订阅频道、模式是通过维护频道字典和模式链表实现的,其中发送消息会先遍历字典和链表找出匹配频道的订阅客户端进行发送,其他pubsub相关查看订阅信息命令都是从频道字典和模式链表中获取信息

最后(一键三连求求拉~)

本篇文章笔记以及案例被收入 gitee-StudyJava、 github-StudyJava 感兴趣的同学可以stat下持续关注喔~

有什么问题可以在评论区交流,如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下~

关注菜菜,分享更多干货,公众号:菜菜的后端私房菜

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

配置 vscode debug 用的 launch.json 文件

打开新项目左边的“运行和调试” 点击蓝色字体“创建 launch.json 文件” 选择上方“python” 选择“Python 文件 调试当前正在运行的Python文件” 配置launch.json文件内容: {// 使用 IntelliSense 了解相关属性// 悬停以查看现有属性的描述。// 欲了解更多信息&a…

linux基础篇:Linux中磁盘的管理(分区、格式化、挂载)

Linux中磁盘的管理(分区、格式化、挂载) 一、认识磁盘 1.1 什么是磁盘 磁盘是一种计算机的外部存储器设备,由一个或多个覆盖有磁性材料的铝制或玻璃制的碟片组成,用来存储用户的信息,这种信息可以反复地被读取和改写…

Leetcode算法训练日记 | day22

一、二叉搜索树的最近公共祖先 1.题目 Leetcode:第 235 题 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足…

Redis相关知识汇总

目录 一、数据类型 二、各数据类型容量 三、Redis持久化机制和优缺点 四、过期键的删除策略 五、回收策略 六、Redis集群策略 七、缓存穿透、缓存击穿、缓存雪崩分别是什么 八、Redis和Mysql如何保证数据一致性 九、Redis分布式锁底层是如何实现的 十、Redis主从复制…

Python 发送邮件 (含代码)

通过Python代码来发送邮件。下面是步骤 先在某一个邮箱页面 开启 POP3/SMTP服务 获取授权码,这样免密码登录 授权码会用在代码里 获得 SMTP 服务器地址 代码 import smtplib from email.mime.text import MIMEText from email.utils import formataddr ms…

一例简单的文件夹病毒的分析

概述 这是一个典型的文件夹病毒,使用xp时代的文件夹图标,通过可移动存储介质传播,会向http://fionades.com/ABIUS/setup.exe下载恶意载荷执行。 其病毒母体只是一个加载器,会在内存是解密加载一个反射型的dll,主要的…

OOM三大场景和解决方案

目录 首先,说说什么是OOM? Java OOM的三大核心场景 场景一、堆内存OOM 类型一:在线OOM分析,这个属于轻量级的分析: 类型二:离线OOM分析,这个属于轻量级的分析: 场景二&#xf…

静态代理 及 示例

静态代理 概念: 静态代理,是代理模式的一种实现方式, 它要求代理类 和 被代理类 实现同一个接口, 这样代理类就可以代替被代理类对象对外提供服务, 当代理类的方法被调用时,代理类会在调用被代理类方法…

私有化客服系统:在线客服搭建与部署的创新之路

随着互联网技术的飞速发展,企业与客户之间的沟通方式也在不断地演变。在这个信息爆炸的时代,一个高效、便捷、智能的在线客服系统成为了企业提升服务质量、增强客户满意度的重要工具。本文将详细介绍在线客服系统的构建、部署以及私有化客服的优势&#…

Ant Design Vue

Ant Design Vue是一个由阿里巴巴团队打造的Vue组件库,它以其优雅的设计和丰富的功能集成而被广泛使用。以下是对Ant Design Vue的简单介绍: 首先,Ant Design Vue采用了精良的设计风格,为用户提供了简约、美观的界面,符…

类和对象—初阶

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1 访问限定符 【面试题】 4.2 封装 【面试题】 5.类的作用域 6.类的实例化 7.类对象模型 7.1 如何计算类对象的大小 7.2 类对象的存储方式 7.3 结构体内存对齐规则 【面试题】…

LMDoply部署实战

使用LMDeoply部署各类开源大模型,进行推理实践。 一. 环境准备 1. 创建Conda环境 studio-conda -t lmdeploy -o pytorch-2.1.2 2. 安装LMDeploy 激活刚刚创建的虚拟环境。 conda activate lmdeploy 安装0.3.0版本的lmdeploy。 pip install lmdeploy[all]0.3.…

Chrome谷歌下载入口

​hello,我是小索奇 发现好多人说谷歌浏览器在哪里下载呀,哪里可以找到? 你可能会心想,一个浏览器你还不会下载啊? 还真是,有很多伙伴找不到下载入口,为什么呢? Bing进行搜索&am…

4.进程相关 2

8.内存映射 8.1 内存映射相关定义 创建一个文件,将保存在磁盘中的文件映射到内存中,后期两个进程之间对内存中的数据进行操作,大大减少了访问磁盘的时间,也是一种最快的 IPC ,因为进程之间可以直接对内存进行存取 8.…

面试经典算法系列之双指针1 -- 合并两个有序数组

面试经典算法题1 – 合并两个有序数组 LeetCode.88 公众号:阿Q技术站 问题描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#…

【讲解下Fiddler的安装和使用】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

设计模式学习笔记 - 设计模式与范式 -行为型:11.迭代器模式(下):如何设计实现一个支持“快照”功能的Iterator

概述 前两篇文章,学习了迭代器模式的原理、实现,并分析了在遍历集合的同时增删元素集合,产生不可预期结果的原因及应对策略。 本章,再来看这样一个问题: 如何实现一个支持 “快照” 功能的迭代器? 这个问…

【IT资质合集】CMMI软件能力成熟度介绍,一定不要错过!

近几年,IT企业在市场上逐渐增多,很多企业为了能在市场上取得一定的发展,那办理几项企业相关资质是不可缺少的,任何一项资质对于企业来说都是具有一定优势的,同时也会更加利于企业的发展。 企业常办理的IT资质类 ✅ C…

C语言每日一题(67)长度最小的子数组

题目链接 209 长度最小的子数组 题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组&#xff0c…

宠物救助系统|基于Springboot和vue的流浪猫狗救助救援系统设计与实现(源码+数据库+文档)

宠物救助目录 基于Springboot和vue的流浪猫狗救助救援系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台: 2、后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌…