Redis發布與訂閱

2022-09-14 15:21:26 字數 2038 閱讀 6853

訂閱/發布訊息圖:

第乙個:訊息傳送者, 第二個:頻道 第三個:訊息訂閱者!

下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關係:

當有新訊息通過 publish 命令傳送給頻道 channel1 時, 這個訊息就會被傳送給訂閱它的三個客戶端:

命令

這些命令被廣泛用於構建即時通訊應用,比如網路聊天室(chatroom)和實時廣播、實時提醒等

命令描述

psubscribe pattern [pattern..]訂閱乙個或多個符合給定模式的頻道。

punsubscribe pattern [pattern..]退訂乙個或多個符合給定模式的頻道。

pubsub subcommand [argument[argument]]檢視訂閱與發布系統狀態。

publish channel message向指定頻道發布訊息

subscribe channel [channel..]訂閱給定的乙個或多個頻道。

subscribe channel [channel..]退訂乙個或多個頻道

測試:訂閱端:

127.0.0.1:6379> subscribe latte  # 訂閱乙個頻道 latte 

reading messages... (press ctrl-c to quit)

1)"subscribe"

2)"latte"

3)(integer) 1

# 等待讀取推送的資訊

1)"message"

# 訊息

2)"latte"

# 那個頻道的訊息

3)"hello"

# 訊息的具體內容

傳送端:

127.0.0.1:6379> publish latte "hello"

# 發布者發布訊息到頻道

(integer) 1

原理

redis是使用c實現的,通過分析 redis 原始碼裡的 pubsub.c 檔案,了解發布和訂閱機制的底層實現,籍 此加深對 redis 的理解。

redis 通過 publish 、subscribe 和 psubscribe 等命令實現發布和訂閱功能。

通過 subscribe 命令訂閱某頻道後,redis-server 裡維護了乙個字典,字典的鍵就是乙個個 頻道!, 而字典的值則是乙個鍊錶,鍊錶中儲存了所有訂閱這個 channel 的客戶端。subscribe 命令的關鍵, 就是將客戶端新增到給定 channel 的訂閱鍊錶中。

通過 publish 命令向訂閱者傳送訊息,redis-server 會使用給定的頻道作為鍵,在它所維護的 channel 字典中查詢記錄了訂閱這個頻道的所有客戶端的鍊錶,遍歷這個鍊錶,將訊息發布給所有訂閱者。

pub/sub 從字面上理解就是發布(publish)與訂閱(subscribe),在redis中,你可以設定對某乙個 key值進行訊息發布及訊息訂閱,當乙個key值上進行了訊息發布後,所有訂閱它的客戶端都會收到相應 的訊息。這一功能明顯的用法就是用作實時訊息系統,比如普通的即時聊天,群聊等功能。

客戶端訂閱,就被鏈結到對應頻道的鍊錶的尾部,退訂則就是將客戶端節點從鍊錶中移除。

應用

使用場景:

Redis 發布與訂閱

redis 自從2.0版本後,增加發布與訂閱等新特性,該功能有點類似設計模式中的觀察者模式,對訊息的生產者與接收者進行松耦合。也可以用該特性實現系統與系統之間的訊息傳遞,該功能的 的實現非常實用和高效。下面我們介紹一下,如何使用發布與訂閱 redis提供發布與訂閱幾個命令 subscribe cha...

redis發布與訂閱

redis在2.8.0版本之後出了乙個新功能,叫pub sub,也叫 發布與訂閱 在這篇文章中不僅要介紹它是如何用的,更重要的是要介紹它的應用場景。在之前介紹websocket之用tubesock在rails實現聊天室 五 的時候,就用redis的pub sub實現過聊天室。相關的 是這樣的 red...

Redis發布與訂閱模式

redis的pub sub實現了發布 訂閱訊息正規化,發布者將訊息發布到不同的頻道,訂閱者訂閱感興趣的頻道訊息,而不需要關心是誰在發布。這種發布者和訂閱者的解耦合方式可以極大的擴充套件的擴充套件性網路拓撲。為了訂閱foo和bar,客戶端發出乙個訂閱的頻道名稱 subscribe foo bar其他客...