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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81936.shtml
英文地址,請注明出處:http://en.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 編譯程序 翻譯程序的三種方式 編譯:將高級語言編寫的源程序翻譯成等價的機器語言或匯編語言。(生成文件,等價)解釋:將高級語言編寫的源程序翻譯一句執行一句,不生成目標文件…