当前位置: 首页 > 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 命令。

相关文章:

  • Linux 强制访问控制深度解析:机制、比较与战略部署
  • 【VLNs篇】05:TGS-在无地图室外环境中使用视觉语言模型进行轨迹生成和选择
  • 基于FPGA控制电容阵列与最小反射算法的差分探头优化设计
  • dlib库的人脸检测案例实现
  • Gitee PPM:智能化项目管理如何重塑软件工厂的未来格局
  • 计算机网络 第三章:运输层(二)
  • 5G 网络寻呼的信令及 IE 信息分析
  • C#对集合进行分组IGroupingout TKey, out TElement>
  • day19-20-四剑客-find-grep-sed-awk
  • C# 大文件分割
  • TensorFlow简介与使用指南
  • 学习笔记:黑马程序员JavaWeb开发教程(2025.4.11)
  • 计算机网络 第三章:运输层(三)
  • 解决自签名证书HTTPS告警:强制使用SHA-256算法生成证书
  • 微软CTO:AI已经“能力过剩”,行业需要努力缩小模型能力与实际产品交付之间的差距
  • AUTOSAR AP 入门0:AUTOSAR_EXP_PlatformDesign.pdf
  • ACM知识点总结 -【搜索技术】
  • 【机器学习】欠拟合、过拟合和正则化
  • 高性能图表库SciChart WPF v8.8全新发布——提升渐变颜色映射高度
  • 力扣-长度最小的子数组
  • 集团网站设计欣赏/北京优化推广
  • 哪里学网站建设与管理/运营推广怎么做
  • 网站开发介绍费/seo搜索引擎优化人员
  • 网站登录后台地址/做个小程序需要花多少钱
  • 网站建设及维护机/舆情监控
  • t字型布局的网站在dw怎么做/中国突然宣布大消息