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” 的频道。该命令返回一个整数,表示收到消息的订阅者数量。

实际演示

  1. 打开两个 redis-cli 终端。

  2. 在第一个终端中,订阅频道 “mychannel”:

    SUBSCRIBE mychannel
    

    终端现在将进入侦听状态,等待 “mychannel” 上的消息。

  3. 在第二个终端中,向 “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”。

实际演示

  1. 打开 3 个 redis-cli 终端。

  2. 在第一个终端中,订阅 “news” 频道:

    SUBSCRIBE news
    
  3. 在第二个终端中,订阅 “news” 和 “updates” 频道:

    SUBSCRIBE news updates
    
  4. 在第三个终端中,向 “news” 频道发布一条消息:

    PUBLISH news "Breaking news!"
    

    第一个和第二个终端将接收该消息。

  5. 在第三个终端中,向 “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”。

实际演示

  1. 打开两个 redis-cli 终端。

  2. 在第一个终端中,订阅 “order.*” 模式:

    PSUBSCRIBE order.*
    
  3. 在第二个终端中,将消息发布到不同的 “order” 频道:

    PUBLISH order.created "New order created"
    PUBLISH order.updated "Order updated"
    PUBLISH order.deleted "Order deleted"
    

    第一个终端将接收所有 3 条消息。

  4. 在第二个终端中,将消息发布到与模式不匹配的通道:

    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。

实践练习

  1. 简单的聊天应用程序: 构建一个简单的聊天应用程序,用户可以在其中向特定频道发送消息,订阅该频道的所有用户都将收到这些消息。使用 PUBLISH 和 SUBSCRIBE 命令。
  2. 实时更新: 模拟股票行情的实时更新。将股票价格发布到不同的渠道(例如,“stock.AAPL“, ”股票。GOOG“),并让客户端订阅他们感兴趣的频道。使用 PUBLISH 和 PSUBSCRIBE 命令。
  3. 事件通知系统: 设计一个事件通知系统,其中应用程序的不同部分可以将事件发布到特定通道(例如,“user.created”、“order.placed”),并且应用程序的其他部分可以订阅这些通道以接收通知。使用 PUBLISH、``SUBSCRIBE 和 PSUBSCRIBE 命令。

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

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

相关文章

JavaSE核心知识点03高级特性03-01(集合框架)

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 JavaSE核心知识点03高级特性03-01&#xff0…

日志分析-IIS日志分析

环境准备 https://xj.edisec.net/challenges/115 题目要求 windows系统中才有的IIS服务 既然是windows平台,当然需要rdp登录,在ssh登录失败 解题过程 phpstudy--2018站点日志.(.log文件)所在路径,提供绝对路径 Windows服务的日志一般有固定…

一、web安全基础入门

1、Windows命令 文件和目录操作 dir:列出当前目录下的文件和子目录。cd:切换目录,例如 cd C:\Users 切换到C盘的Users目录。md 或 mkdir:创建新目录,如 md testdir。rd 或 rmdir:删除空目录,例…

动态规划应用场景 + 代表题目清单(模板加上套路加上题单)

1. 序列型DP(Sequence DP) ✅ 应用场景 单个或多个序列(数组/字符串),求最优子结构。 常见问题:最长递增子序列、最长公共子序列、回文子序列。 🧠 套路总结 单序列:dp[i] max(…

Linux iSCSI存储共享实验指南

实验介绍 1、在Linux平台上通过iSCSI协议实现IP-SAN存储共享 2、掌握存储导出(export)和存储导入(import)的配置方法 3、学习iSCSI存储的发现、连接、断开和管理操作 1、实验环境 两台同网段的Linux虚拟机(无需物理交换机) 操作系统:Lin…

从 Docker 到 runC

从 Docker 到 runC:容器底层原理详解 目录 1. Docker 与 runC 的关系 2. Docker 的核心组件 3. runC 的核心功能 4. 实战示例:从 Docker 到 runC 4.1 示例场景:运行一个简单容器 4.2 Docker 底层调用 runC 的流程 4.3 查看 runC 的调用 4.4 直接调用 runC 创建容器 …

使用Python在PowerPoint中插入形状(Shape)

在进行演示文稿设计时,形状(Shape)不仅可以增强视觉效果,还可以用于展示流程图、标注、数据图示等。借助Python,我们可以通过代码快速批量地在PPT中添加各种形状,提升设计效率。本文将介绍如何使用Python向…

Windows系统下MySQL 8.4.5压缩包安装详细教程

一、MySQL 8.4.5新特性概览 相较于旧版本,MySQL 8.4.5在性能与功能上实现了显著提升: 性能优化:官方测试显示,在高并发场景下,其读写性能较5.7版本提升近2倍,尤其在处理热点数据竞争问题时表现更为出色。…

深度解析Vue项目Webpack打包分包策略 从基础配置到高级优化,全面掌握性能优化核心技巧

深度解析Vue项目Webpack打包分包策略 从基础配置到高级优化,全面掌握性能优化核心技巧 一、分包核心价值与基本原理 1.1 为什么需要分包 首屏加载优化:减少主包体积,提升TTI(Time to Interactive)缓存利用率提升&am…

【昇腾开发者训练营:Dify大模型部署实战】MindIE + Dify + DeepSeek + Embedding模型 + Rerank模型

文章目录 部署 Dify1. Dify 适配 ARM2. 安装 docker3. 启动 Dify MindIEDify 实操手册1. 基础环境搭建1.1 环境检查1.2 下载模型权重1.3 获取MindIE镜像 2. 启动容器3. 纯模型推理测试3.1 纯模型对话测试3.2 性能测试 4. 服务化部署4.1 MindIE 配置4.2 MindIE 服务化4.3 发起测…

塔能高温冰蓄冷技术:工厂能耗精准节能的创新之路

在工厂的能耗构成中,制冷系统是重要的耗能环节。传统的水蓄冷和冰蓄冷技术在实际应用中存在一些局限性,难以满足工厂对节能和成本控制的更高要求。塔能科技的高温冰蓄冷技术,凭借其独特的优势,为工厂能耗精准节能提供了创新的解决…

通过现代数学语言重构《道德经》核心概念体系,形成一个兼具形式化与启发性的理论框架

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

SQLMesh Typed Macros:让SQL宏更强大、更安全、更易维护

在SQL开发中,宏(Macros)是一种强大的工具,可以封装重复逻辑,提高代码复用性。然而,传统的SQL宏往往缺乏类型安全,容易导致运行时错误,且难以维护。SQLMesh 引入了 Typed Macros&…

5月23日day34打卡

GPU训练及类的call方法 知识点回归: CPU性能的查看:看架构代际、核心数、线程数GPU性能的查看:看显存、看级别、看架构代际GPU训练的方法:数据和模型移动到GPU device上类的call方法:为什么定义前向传播时可以直接写作…

集群、容器云与裸金属服务器的全面对比分析

文章目录 引言 集群 2.1 定义 2.2 特点 2.3 应用场景 容器云 3.1 定义 3.2 核心功能 3.3 应用场景 裸金属 4.1 定义 4.2 特点 4.3 应用场景 三者的区别 5.1 架构与性能 5.2 管理与运维 5.3 成本与灵活性 总结 1. 引言 在云计算和数据中心领域,50…

Vscode +Keil Assistant编译报错处理

Vscode Keil Assistant编译报错处理 1.报错图片内容 所在位置 行:1 字符: 25 chcp.com 65001 -Command & c:\Users\92170.vscode\extensions\cl.keil-a … ~ 不允许使用与号(&)。& 运算符是为将来使用而保留的;请用双引号将与号引起来(“&”)&…

Java实现中文金额转换

概述 话不多说,直接上代码 代码 /*** Author: hweiyu* Description: TODO* Date: 2025/5/23 11:33*/ import java.math.BigDecimal; import java.util.Scanner;public class AmountToChinese {// 中文数字字符private static final String[] NUMBERS {"零&…

Oracle 的 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH 命令

Oracle 的ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH 命令 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH 是 Oracle Data Guard 环境中用于停止恢复过程并准备备用数据库切换为主库的关键命令。 命令用途 该命令主要用于以下场景: 故…

Java 依赖管理工具:使用 Sonatype Nexus 管理项目依赖

Java 依赖管理工具:使用 Sonatype Nexus 管理项目依赖 在 Java 开发领域,依赖管理是项目构建和维护过程中的关键环节。Sonatype Nexus 作为一个功能强大的依赖管理工具,能够有效地帮助我们管理项目的各种依赖,提高开发效率并降低…

编译原理 期末速成

一、基本概念 1. 翻译程序 vs 编译程序 翻译程序的三种方式 编译:将高级语言编写的源程序翻译成等价的机器语言或汇编语言。(生成文件,等价)解释:将高级语言编写的源程序翻译一句执行一句,不生成目标文件…