当前位置: 首页 > news >正文

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.xdnf.cn/news/583597.html

相关文章:

  • 【C++20新特性】ranges::sort()使用方法,优势,注意点
  • 【1004. 最大连续1的个数 III】
  • ai之pdf解析工具 PPStructure 还是PaddleOCR
  • 火山引擎火山云带宽价格
  • 【工作流】Fastgpt配置豆包模型-火山引擎
  • Github 2025-05-22Go开源项目日报 Top10
  • 【COMPUTEX 2025观察】NVIDIA开放NVLink:一场重构AI算力版图的“阳谋“
  • Go File多终端数据同步技术全解:跨设备数据管理实战指南与复杂场景处理过程
  • PostgreSQL14 +patroni+etcd+haproxy+keepalived 集群部署指南
  • C#在 .NET 9.0 中启用二进制序列化:配置、风险与替代方案
  • 模型剪枝的定义与核心作用
  • 硬件开发复盘实战指南
  • CTF签到题
  • 自制操作系统day8 (鼠标数据取得、通往32位模式之路、A20GATE、切换到保护模式、控制寄存器cr0-cr4以及cr8、ALIGNB)
  • 基于 AMDXCVU47P HBM2 FPGA 的 2 路 100G 光纤 PCIe 高性能计算加速卡
  • LabVIEW多通道液位监控
  • 框架开发与原生开发的权衡:React案例分析(原生JavaScript)
  • 【hadoop】Spark的安装部署
  • jvm安全点(五)openjdk17 c++源码垃圾回收之安全点阻塞状态线程在安全点同步中无需调用block函数的详细流程解析
  • Vue:axios(GET请求)
  • 【VLNs篇】04:SayNav-为新环境中的动态规划到导航进行大型语言模型的基础构建
  • 批量处理合并拆分pdf功能 OCR 准确率高 免费开源
  • 华为昇腾开发——多模型资源管理(C++)
  • Apollo10.0学习——planning模块(9)之参数详解二
  • WooCommerce缓存教程 – 如何防止缓存破坏你的WooCommerce网站?
  • 7.2.顺序查找
  • 黑马点评前端Nginx启动失败问题解决记录
  • day26- 系统编程之 文件IO(II) 及 文件属性
  • 数据结构:绪论之时间复杂度与空间复杂度
  • 论文阅读笔记——PixArt-α,PixArt-δ