redis Pub/Sub 简介 -16 (PUBLISH、SUBSCRIBE、PSUBSCRIBE)
Redis Pub/Sub 简介:PUBLISH、SUBSCRIBE、PSUBSCRIBE
Redis Pub/Sub 是一种强大的消息传递范例,可在应用程序的不同部分之间实现实时通信。它是构建可扩展和响应式系统的基石,允许组件在没有直接依赖的情况下进行交互。本章将全面介绍 Redis Pub/Sub,重点介绍核心命令:PUBLISH、``SUBSCRIBE
和 PSUBSCRIBE
。我们将探讨这些命令的工作原理、它们的用例以及如何有效地实现它们。
了解 Pub/Sub 范例
Pub/Sub 是 Publish/Subscription 的缩写,是一种消息传递模式,其中消息的发送者(发布者)不对消息进行编程,以直接发送给特定的接收者(订阅者)。相反,发布者将消息分类到通道中,订阅者表示对一个或多个通道感兴趣。当发布者向通道发送消息时,该通道的所有订户都会收到该消息。
关键概念
- Publisher: 将消息发送到特定通道的实体。
- Subscriber: 从一个或多个通道接收消息的实体。
- Channel: 一个命名的虚拟 “主题” 或 “源” ,用于发布消息。订阅者收听这些频道。
- Message: 从发布服务器传输到订阅服务器的数据。
Redis Pub/Sub 的工作原理
Redis Pub/Sub 直接在 Redis 服务器中实现。客户端连接到 Redis 服务器,并将消息发布到频道或订阅频道以接收消息。Redis 服务器充当消息代理,将消息从发布者路由到订阅者。
- 异步通信: Pub/Sub 本质上是异步的。发布者不会等待订阅者接收消息,订阅者会在消息发布时接收消息。
- 解耦: Pub/Sub 将发布者和订阅者分离。发布者不需要了解订阅者的任何信息,订阅者也不需要了解发布者的任何信息。这使得构建可扩展且可维护的系统变得更加容易。
- 一对多通信: 发布到频道的单条消息可以被多个订阅者接收。
PUBLISH
命令
PUBLISH
命令用于向特定通道发送消息。
语法
PUBLISH channel message
channel
:消息将发布到的通道的名称。message
:需要发送的消息内容。
例
PUBLISH mychannel "Hello, subscribers!"
此命令将消息 “Hello, subscribers!” 发布到名为 “mychannel” 的频道。该命令返回一个整数,表示收到消息的订阅者数量。
实际演示
-
打开两个
redis-cli
终端。 -
在第一个终端中,订阅频道 “mychannel”:
SUBSCRIBE mychannel
终端现在将进入侦听状态,等待 “mychannel” 上的消息。
-
在第二个终端中,向 “mychannel” 发布一条消息:
PUBLISH mychannel "This is a test message"
第一个终端将收到以下消息:
1. "message" 2. "mychannel" 3. "This is a test message"
第二个终端中的
PUBLISH
命令将返回1
,表示一个订阅者收到了该消息。
重要注意事项
- 消息传递: Redis Pub/Sub 提供至少一次交付。保证将消息传送到在发布消息时连接的所有订阅者。但是,如果订阅者断开连接并重新连接,则可能会错过在断开连接时发布的消息。Redis Pub/Sub 不会持久保存消息。
- 消息格式: 消息可以是任何字符串。Redis 不强制执行任何特定格式。但是,对于复杂数据,通常使用 JSON 等结构化格式。
SUBSCRIBE
命令
SUBSCRIBE
命令用于订阅一个或多个通道。当客户端订阅频道时,它将接收发布到该频道的所有消息。
语法
SUBSCRIBE channel [channel ...]
channel
:要订阅的频道的名称。您可以通过在SUBSCRIBE
命令后列出多个频道来订阅这些频道。
例
SUBSCRIBE news updates
此命令为客户端订阅两个频道:“news”和“updates”。
实际演示
-
打开
3 个 redis-cli
终端。 -
在第一个终端中,订阅 “news” 频道:
SUBSCRIBE news
-
在第二个终端中,订阅 “news” 和 “updates” 频道:
SUBSCRIBE news updates
-
在第三个终端中,向 “news” 频道发布一条消息:
PUBLISH news "Breaking news!"
第一个和第二个终端将接收该消息。
-
在第三个终端中,向 “updates” 频道发布一条消息:
PUBLISH updates "Software update available"
只有第二个终端会收到此消息。
取消订阅
要取消订阅频道,请使用 UNSUBSCRIBE
命令:
UNSUBSCRIBE channel [channel ...]
如果未指定频道,则客户端将取消订阅当前订阅的所有频道。
重要注意事项
- 阻塞作:
SUBSCRIBE
命令是一个阻塞作。一旦客户端订阅了一个或多个频道,它将进入侦听状态,并且在取消订阅之前无法执行其他 Redis 命令。 - 专用连接: 通常的做法是将专用的 Redis 连接用于 Pub/Sub 作。这可以防止阻止应用程序中需要执行常规 Redis 命令的其他部分。
PSUBSCRIBE
命令
PSUBSCRIBE
命令用于订阅使用模式的通道。这允许您订阅与特定模式匹配的多个频道。
语法
PSUBSCRIBE pattern [pattern ...]
pattern
:一种 glob 样式模式,指定要订阅的频道。
例
PSUBSCRIBE order.*
此命令为客户端订阅所有以 “order.” 开头的频道,例如 “order.created”、“order.updated” 和 “order.deleted”。
实际演示
-
打开两个
redis-cli
终端。 -
在第一个终端中,订阅 “order.*” 模式:
PSUBSCRIBE order.*
-
在第二个终端中,将消息发布到不同的 “order” 频道:
PUBLISH order.created "New order created" PUBLISH order.updated "Order updated" PUBLISH order.deleted "Order deleted"
第一个终端将接收所有 3 条消息。
-
在第二个终端中,将消息发布到与模式不匹配的通道:
PUBLISH product.created "New product created"
第一个终端_将不会_收到此消息。
取消订阅模式
要取消订阅模式,请使用 PUNSUBSCRIBE
命令:
PUNSUBSCRIBE pattern [pattern ...]
如果未指定模式,则 Client 端将取消订阅当前订阅的所有模式。
检查 Pub/Sub 状态
打开第三个 redis-cli
终端。
检查员(3 号航站楼):
PUBSUB CHANNELS
此命令将列出活动通道。如果终端 1 中的订阅者订阅了 news:*
和 chat:room1
,并且没有其他客户端正在使用 Pub/Sub,则输出可能是:
1) "news:sports"
2) "news:politics"
3) "chat:room1"
请注意,列出的通道是消息已发布到的通道,以及有活动订阅者的通道。
PUBSUB NUMPAT
此命令将返回活动模式订阅的数量。在这种情况下,它将返回 1
,因为终端 1 中的订阅者订阅了 news:*
模式。
PUBSUB NUMSUB chat:room1 news:sports
此命令将返回 chat:room1
和 news:sports
频道的订阅者数量。输出可能是:
1) "chat:room1"
2) "1"
3) "news:sports"
4) "1"
这表示每个频道都有一个订阅者。
重要注意事项
- 模式匹配: Redis 对
PSUBSCRIBE
使用 glob 样式模式。以下字符具有特殊含义:*
:匹配零个或多个字符。?
:只匹配一个字符。[]
:匹配括号内的字符之一。
- 多种模式: 您可以使用单个
PSUBSCRIBE
命令订阅多个模式。 - 操作顺序: 如果客户端同时订阅了直接通道(使用
SUBSCRIBE
)和匹配同一通道的模式(使用PSUBSCRIBE),
它将收到两次消息:一次用于直接订阅,一次用于模式 subscription。
实践练习
- 简单的聊天应用程序: 构建一个简单的聊天应用程序,用户可以在其中向特定频道发送消息,订阅该频道的所有用户都将收到这些消息。使用
PUBLISH
和SUBSCRIBE
命令。 - 实时更新: 模拟股票行情的实时更新。将股票价格发布到不同的渠道(例如,“stock.AAPL“, ”股票。GOOG“),并让客户端订阅他们感兴趣的频道。使用
PUBLISH
和PSUBSCRIBE
命令。 - 事件通知系统: 设计一个事件通知系统,其中应用程序的不同部分可以将事件发布到特定通道(例如,“user.created”、“order.placed”),并且应用程序的其他部分可以订阅这些通道以接收通知。使用
PUBLISH、``SUBSCRIBE
和PSUBSCRIBE
命令。
相关文章:
redis Pub/Sub 简介 -16 (PUBLISH、SUBSCRIBE、PSUBSCRIBE)
Redis Pub/Sub 简介:PUBLISH、SUBSCRIBE、PSUBSCRIBE Redis Pub/Sub 是一种强大的消息传递范例,可在应用程序的不同部分之间实现实时通信。它是构建可扩展和响应式系统的基石,允许组件在没有直接依赖的情况下进行交互。本章将全面介绍 Redis…...

《黄帝内经》数学建模与形式化表征方式的重构
黄帝内经的数学概括:《黄帝内经》数学建模与形式化表征方式的重构 摘要:《黄帝内经》通过现代数学理论如动力系统、代数拓扑和随机过程,被重构为一个形式化的人体健康模型。该模型包括阴阳动力学的微分几何、五行代数的李群结构、经络拓扑与同…...
PyTorch Image Models (timm) 技术指南
timm PyTorch Image Models (timm) 技术指南功能概述 一、引言二、timm 库概述三、安装 timm 库四、模型加载与推理示例4.1 通用推理流程4.2 具体模型示例4.2.1 ResNeXt50-32x4d4.2.2 EfficientNet-V2 Small 模型4.2.3 DeiT-3 large 模型4.2.4 RepViT-M2 模型4.2.5 ResNet-RS-1…...
基于Scikit-learn与Flask的医疗AI糖尿病预测系统开发实战
引言 在精准医疗时代,人工智能技术正在重塑临床决策流程。本文将深入解析如何基于MIMIC-III医疗大数据集,使用Python生态构建符合医疗AI开发规范的糖尿病预测系统。项目涵盖从数据治理到模型部署的全流程,最终交付符合DICOM标准的临床决策支…...
掌握聚合函数:COUNT,MAX,MIN,SUM,AVG,GROUP BY和HAVING子句的用法,Where和HAVING的区别
对于Java后端开发来说,必须要掌握常用的聚合函数:COUNT,MAX,MIN,SUM,AVG,掌握GROUP BY和HAVING子句的用法,掌握Where和HAVING的区别: ✅ 一、常用聚合函数(聚…...

【Node.js】高级主题
个人主页:Guiat 归属专栏:node.js 文章目录 1. Node.js 高级主题概览1.1 高级主题架构图 2. 事件循环与异步编程深度解析2.1 事件循环机制详解事件循环阶段详解 2.2 异步编程模式演进高级异步模式实现 3. 内存管理与性能优化3.1 V8 内存管理机制内存监控…...

【Linux】定时任务 Crontab 与时间同步服务器
目录 一、用户定时任务的创建与使用 1.1 用户定时任务的使用技巧 1.2 管理员对用户定时任务的管理 1.3 用户黑白名单的管理 一、用户定时任务的创建与使用 1.1 用户定时任务的使用技巧 第一步:查看服务基本信息 systemctl status crond.service //查看周期性…...

【TCP/IP协议族详解】
目录 第1层 链路/网络接口层—帧(Frame) 1. 链路层功能 2. 常见协议 2.1. ARP(地址解析协议) 3. 常见设备 第2层 网络层—数据包(Packet) 1. 网络层功能 2. 常见协议 2.1. ICMP(互联网…...

蓝桥杯电子赛_零基础利用按键实现不同数字的显现
目录 一、前提 二、代码配置 bsp_key.c文件 main.c文件 main.c文件的详细讲解 功能实现 注意事项 一、前提 按键这一板块主要是以记忆为主,我直接给大家讲解代码去实现我要配置的功能。本次我要做的项目是板子上的按键有S4~S19,我希望任意一个按键…...

Docker架构详解
一,Docker的四大要素:Dockerfile、镜像(image)、容器(container)、仓库(repository) 1.dockerfile:在dockerfile文件中写构建docker的命令,通过dockerbuild构建image 2.镜像:就是一个只读的模板,镜像可以用来创建docker容器&…...

Rust 学习笔记:关于生命周期的练习题
Rust 学习笔记:关于生命周期的练习题 Rust 学习笔记:关于生命周期的练习题生命周期旨在防止哪种编程错误?以下代码能否通过编译?若能,输出是?如果一个引用的生命周期是 static,这意味着什么&…...

Spring AI 模块架构与功能解析
Spring AI 是 Spring 生态系统中的一个新兴模块,专注于简化人工智能和机器学习技术在 Spring 应用程序中的集成。本文将详细介绍 Spring AI 的核心组件、功能模块及其之间的关系,帮助具有技术基础的读者快速了解和应用 Spring AI。 Spring AI 的核心概念…...
单元测试学习笔记
单元测试是软件测试的基础层级,主要针对代码的最小可测试单元进行验证。单元测试可以帮助快速定位问题边界,提升代码可维护性,支持安全的重构操作。 测试对象: 独立函数/方法纯工具类(如数据处理函数)UI组…...

多模态大语言模型arxiv论文略读(九十)
Hybrid RAG-empowered Multi-modal LLM for Secure Data Management in Internet of Medical Things: A Diffusion-based Contract Approach ➡️ 论文标题:Hybrid RAG-empowered Multi-modal LLM for Secure Data Management in Internet of Medical Things: A Di…...

(1-6-1)Java 集合
目录 0.知识概述: 1.集合 1.1 集合继承关系类图 1.2 集合遍历的三种方式 1.3 集合排序 1.3.1 Collections实现 1.3.2 自定义排序类 2 List 集合概述 2.1 ArrayList (1)特点 (2)常用方法 2.2 LinkedList 3…...

spring5-配外部文件-spEL-工厂bean-FactoryBean-注解配bean
spring配外部文件 我们先在Spring里配置一个数据源 1.导c3p0包,这里我们先学一下hibernate持久化框架,以后用mybites. <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.2.…...
[安全清单] Linux 服务器安全基线:一份可以照着做的加固 Checklist
更多服务器知识,尽在hostol.com 嘿,各位服务器的“守护者”们!当你拿到一台崭新的Linux服务器,或者接手一台正在运行的服务器时,脑子里是不是会闪过一丝丝关于安全的担忧?“我的服务器安全吗?”…...
企业级单元测试流程
企业级的单元测试流程不仅是简单编写测试用例,而是一整套系统化、自动化、可维护、可度量的工程实践,贯穿从代码编写到上线部署的全生命周期。下面是一个尽可能完善的 企业级单元测试流程设计方案,适用于 Java 生态(JUnit Mockit…...

安卓开发用到的设计模式(2)结构型模式
安卓开发用到的设计模式(2)结构型模式 文章目录 安卓开发用到的设计模式(2)结构型模式1. 适配器模式(Adapter Pattern)2. 装饰器模式(Decorator Pattern)3. 代理模式(Pro…...

JavaWeb:SpringBoot配置优先级详解
3种配置 打包插件 命令行 优先级 SpringBoot的配置优先级决定了不同配置源之间的覆盖关系,遵循高优先级配置覆盖低优先级的原则。以下是详细的优先级排序及配置方法说明: 一、配置优先级从高到低排序 1.命令行参数 优先级最高,通过keyvalu…...

故障率预测:基于LSTM的GPU集群硬件健康监测系统(附Prometheus监控模板)
一、GPU集群健康监测的挑战与价值 在大规模深度学习训练场景下,GPU集群的硬件故障率显著高于传统计算设备。根据2023年MLCommons统计,配备8卡A100的服务器平均故障间隔时间(MTBF)仅为1426小时,其中显存故障占比达38%&…...

【b站计算机拓荒者】【2025】微信小程序开发教程 - chapter3 项目实践 -1 项目功能描述
1 项目功能描述 # 智慧社区-小程序-1 欢迎页-加载后端:动态变化-2 首页-轮播图:动态-公共栏:动态-信息采集,社区活动,人脸检测,语音识别,心率检测,积分商城-3 信息采集页面-采集人数…...

FFmpeg 安装包全攻略:gpl、lgpl、shared、master 区别详解
这些 FFmpeg 安装包有很多版本和变种,主要区别在于以下几个方面: ✅ 一、从名称中看出的关键参数: 1. 版本号 master:开发版,最新功能,但可能不稳定。n6.1 / n7.1:正式版本,更稳定…...

AI浪潮下,媒体内容运营的五重变奏
算法驱动的个性化推荐 在信息爆炸的时代,用户面临着海量的内容选择,如何让用户快速找到感兴趣的人工智能内容,成为媒体运营的关键。算法驱动的个性化推荐模式应运而生,它通过分析用户的行为数据,如浏览历史、点赞、评论、搜索关键词等,构建用户兴趣画像 ,再依据画像为用…...

WindTerm 以 SSH 协议的方式通过安恒明御堡垒机间接访问服务器
1. 配置堡垒机秘钥 创建公私钥ssh-keygen -t rsa -b 4096执行完该命令后按照提示一路回车就能够创建出公私钥注意:在创建过程中会让你指定秘钥的存储位置以及对应的密码,最好自行指定一下 id_rsa 是私钥id_rsa.pub 是公钥 在堡垒机中指定创建好的私钥 …...

通过现代数学语言重构《道德经》核心概念体系,形成一个兼具形式化与启发性的理论框架
以下是对《道德经》的数学转述尝试,通过现代数学语言重构其核心概念,形成一个兼具形式化与启发性的理论框架: 0. 基础公理体系 定义: 《道德经》是一个动态宇宙模型 U(D,V,Φ),其中: D 为“道”的无限维…...

邂逅Node.js
首先先要来学习一下nodejs的基础(和后端开发有联系的) 再然后的学习路线是学习npm,yarn,cnpm,npx,pnpm等包管理工具 然后进行模块化的使用,再去学习webpack和git(版本控制工具&…...
计算机视觉(图像算法工程师)学习路线
计算机视觉学习路线 Python基础 常量与变量 列表、元组、字典、集合 运算符 循环 条件控制语句 函数 面向对象与类 包与模块Numpy Pandas Matplotlib numpy机器学习 回归问题 线性回归 Lasso回归 Ridge回归 多项式回归 决策树回归 AdaBoost GBDT 随机森林回归 分类问题 逻辑…...
GITLIbCICD流水线搭建
1,搭建gitLIb服务器,创建gitlibRunner 并且注册, 2. 写dockerfile 包块java程序运行的环境,jdk,参数等 , 2.1ai生成版本, # 基础镜像(JDK 17)FROM eclipse-temurin:1…...
详细介绍Qwen3技术报告中提到的模型架构技术
详细介绍Qwen3技术报告中提到的一些主流模型架构技术,并为核心流程配上相关的LaTeX公式。 这些技术都是当前大型语言模型(LLM)领域为了提升模型性能、训练效率、推理速度或稳定性而采用的关键组件。 1. Grouped Query Attention (GQA) - 分组…...