Redis訂閱與發佈

来源:https://www.cnblogs.com/thomson-fred/archive/2019/02/12/10363758.html
-Advertisement-
Play Games

發佈與訂閱模型在許多編程語言中都有實現,也就是我們經常說的設計模式中的一種--觀察者模式。在一些應用場合,例如發送方並不是以固定頻率發送消息,如果接收方頻繁去咨詢發送方,這種操作無疑是很麻煩並且不友好的。 舉個生活的例子,一個喜歡購買鮮牛奶的人,需要每天在上班的時候/下班的時候都專門去牛奶店購買鮮牛 ...


 發佈與訂閱模型在許多編程語言中都有實現,也就是我們經常說的設計模式中的一種--觀察者模式。在一些應用場合,例如發送方並不是以固定頻率發送消息,如果接收方頻繁去咨詢發送方,這種操作無疑是很麻煩並且不友好的。

舉個生活的例子,一個喜歡購買鮮牛奶的人,需要每天在上班的時候/下班的時候都專門去牛奶店購買鮮牛奶,但不一定每天去到那裡都剛好有自己喜歡的那一種牛奶,這個時候,這個人跑老遠的距離都白費了。但如果這個人去牛奶店一次性訂閱了一個月的某種牛奶,那麼他就不用擔憂今天是否能買到鮮牛奶了,只要送奶員把牛奶送到他家樓下的箱子裡面就行。

而訂閱發佈模型與這個例子有點類似,訂閱者只要訂閱註冊某個頻道就可以“高枕無憂”了,當有消息發送過來的時候,會通過訂閱的頻道接收。優勢在於把耦合點獨立分離處理,作為發佈方和接收方的中介,實現了發佈方和接收方的隔離,

 

訂閱與發佈系統是Redis的一個高級屬性,多個客戶端可以同時訂閱同一個頻道,類似廣播的機制。所不同的是,一個客戶端可以同時訂閱多個頻道。

樣例圖:

 

Redis訂閱發佈系統,伺服器在背後的工作:

伺服器中維護著一個pubsub_channels字典,所有的頻道和訂閱關係都存儲在這裡。字典的鍵為頻道的名稱,而值為訂閱頻道的客戶端鏈表。

1. 當有新的客戶端訂閱某個頻道時,會發生兩種情況中的一種:

1)如果頻道已經存在,則新的客戶端會添加到pubsub_channels對應頻道的鏈表末尾

2)如果頻道原本不存在,則會為頻道創建一個鍵,該客戶端成為鏈表的第一個元素

2. 當一個客戶端退訂一個頻道的時候:

pubsub_channels對應鍵的鏈表會刪除該客戶端

3. 發送信息

伺服器會遍歷pubsub_channels中對應鍵的鏈表,向每一個客戶端發送信息

 

伺服器還維護著一個pubsub_patterns鏈表,鏈表的pattern屬性記錄了被訂閱的模式,而client屬性記錄了訂閱模式的客戶端

1. 當有新的客戶端訂閱某個模式的時,會進行如下步驟:

1)創建一個鏈表節點,pattern屬性記錄訂閱的模式,client記錄訂閱模式的客戶端

2)將這個鏈表節點添加到pubsub_patterns鏈表中

2. 當一個客戶端退訂某一個模式的時候:

伺服器遍歷pubsob_patterns找到對應的pattern同時也是對應該client客戶端的節點,將改節點刪除

3. 發送信息

伺服器遍歷pubsub_channels,查找與channels頻道相匹配的模式麻將消息發送給訂閱了這些模式的客戶端。

 

Redis訂閱系統的優勢:

1. 當一個客戶端向頻道發送一個信息,訂閱了同一個頻道/模式的多個客戶端可以同時接收到信息,類似廣播的機制。

2. 便於Sentinel哨兵與伺服器間的通信併進行監控

 

 

1. 訂閱頻道

命令格式:

SUSCRIBE   channel1  [channel2]  [channel3]

例如(同時訂閱兩個頻道):

redis> subscribe  local_system  remote_system

Reading messages... (press Ctrl-C to quit)

1) "subscribe"       # 返回值的類型:顯示訂閱成功

2) "local_system"           # 訂閱的頻道名字

3)"remote _system "

4) (integer) 2       # 目前已訂閱的頻道數量

 

訂閱和接收者:

發送者:

 

 

註意:客戶端一點與某個頻道建立連接就不能進行其他操作,一旦客戶端退出連接,訂閱的頻道自動會斷開。

 

2. 訂閱模式

PSUBSCRIBE  pattern1  [pattern2]  [pattern3]

pattern可以用符號*進行模糊匹配,例如:

remo*   #匹配以remo開頭的模式

*system  #匹配以system結尾的模式

 

例如:

客戶端1

客戶端2

註意:返回的integer為1是指匹配了一個模式,實際上是匹配了兩個頻道。

 

發佈信息命令:

客戶端:

 

 

3. 取消訂閱:

命令:

1)取消訂閱頻道

UNSUBSCRIBE  channel1  [channel2]

2)取消訂閱模式

PUNSUBSCRIBE  [pattern [pattern …]]

由於在客戶端界面無法實現,這裡就不展示了。而在編程過程中是可以實現的。

關於python中的編程,可以看看這篇文章:

http://www.cnblogs.com/anpengapple/p/7027979.html

 

4. 發佈消息

命令:

PUBLISH channel message

向一個頻道發送信息,所有訂閱這個頻道的客戶端都會接收到信息

 

5. 查看已有的頻道

命令:

PUBSUB  subcommand [argument [argument ...]]

subcommand子命令:

1)PUBSUB CHANNELS  [pattern]

列出當前的活躍頻道

如果給定pattern參數,則會返回伺服器當前被訂閱的頻道中與pattern模式相匹配的頻道

 

2)PUBSUB NUMSUB [channel-1 … channel-N]

返回給定頻道的訂閱者數量, 訂閱模式的客戶端不計算在內

因為有一個是匹配模式,所以返回的interger值為1

 

3)PUBSUB NUMPAT

返回訂閱模式的數量

 

 

Sentinel哨兵中的應用:

Sentinel伺服器與Master伺服器/Slave伺服器之間的訂閱發佈系統是Sentinl監控過程的一個重要環節,通過訂閱發佈系統達到監控伺服器狀態的作用。其運行原理與上面的客戶端伺服器之間的訂閱機制無太大區別,都是基於網路連接的數據傳輸。Sentinel之間的通信也是通過Sentinel與服務武器間的這個訂閱發佈系統實現的,一個Sentinel通過伺服器的頻道發送信息,其他Sentinel就會接收到。

 

參考文章:

http://www.cnblogs.com/anpengapple/p/7027979.html

《redis設計與實現》

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 每種堆法(理解成名次序列,舉例3,3,8,2和7,7,100,2都對應2,2,1,3這個名次序列)等概率出現;題目中“兩種堆法不同當且僅當某個積木在兩種堆法中處於不同的層中”可見這是個組合問題,於是設一個名次的生成函數F(x)=sum i=1 inf 1\ x^i/(i!) 。因為F(x)的常數項為 ...
  • $RT$,無源匯上下界可行流就是一種沒有源匯點的上下界可行流問題。# 題目 給出一個有向圖。每條邊有流量上界和下界,問是否存在一中流量分配方案,使得每個點流量守恆(即流入量=流出量) 思路 解決這種問題的主體思路就是在初始流的基礎上不斷添加流量,使得滿足流 ...
  • 參考書 《TensorFlow:實戰Google深度學習框架》(第2版) 例子:從一個張量創建一個數據集,遍歷這個數據集,並對每個輸入輸出y = x^2 的值。 運行結果: ​ 數據是文本文件:創建數據集。 運行結果: ​ 數據是TFRecord文件:創建TFRecord測試文件。 運行結果: ​ ...
  • Given the root to a binary tree, implement serialize(root), which serializes the tree into a string, and deserialize(s), which deserializes the string ...
  • 簡述 OData,即Open Data Protocol,是由微軟在2007年推出的一款開放協議,旨在通過簡單、標準的方式創建和使用查詢式及互動式RESTful API。 類庫 在.NET Core中想要使用OData功能的話需要添加 包。 準備模型類 創建Edm模型 OData使用EDM,即Ent ...
  • 常用示例如下:takeown /f 文件名 獲取該文件的所屬權takeown /f /r /d n 文件夾 獲取整個文件夾及其下麵子目錄文件的所屬權takeown /f * /a /r /d y強制將當前目錄下的所有文件及文件夾、子文件夾下的所有者更改為管理員組(administrators)cac... ...
  • 1.創建文件夾:mkdir 文件夾名稱 2.查看IP地址信息:ipconfig -a 3.查看記憶體使用情況:free -m 4.查看CPU使用情況:top 5.查看磁碟使用情況:df -a/-h 6.查看當前文件夾大小:du -sh 7.創建文件:touch -linux.sh(空白文件) cat> ...
  • 文件許可權 瞭解文件許可權前需要先知道用戶和用戶組的概念 用戶:https://www.cnblogs.com/holmes-cat/p/10345553.html用戶組:https://www.cnblogs.com/holmes-cat/p/10346842.html 1.使用 ll -a 命令可以 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...