redis發佈與訂閱詳解,剛好符合頭條的好友關注及推薦模式的應用

redis發佈與訂閱

本文講解Redis發佈(pub)與訂閱(sub),它是一種消息通信模式,Redis的發佈訂閱機制包括三個主體,發佈者,訂閱者和Channel(頻道)。

redis的發佈與訂閱的特點是訂閱者負責訂閱頻道( channel),發送者( publisher)負責向頻道發送二進制字符串消息(message)。當有信息被髮送到定製的頻道時,該頻道的所有訂閱者都將會受到消息。這個模式可以參考顯示生活當中電臺的運作流程。我們作為訂閱者可以收聽(即訂閱)多個電臺,而電臺工作人員(發送者)可以在任何電臺發送消息,收聽的該電臺的聽眾都可以收到該頻道的消息。

redis訂閱頻道

redis的server端當中維持著一個pubsub_channels 屬性是一個字典, 這個字典就用於保存訂閱頻道的信息。它是一個redis的list類型的結構。當客戶端通過調用命令SUBSCRIBE進行訂閱頻道時,就把對應的客戶端和訂閱的頻道通過字典pubsub_channels 中的頻道信息進行關聯。

比如:我們模擬三個客戶端client1、client2、client3 同時訂閱了channel1。命令如下:

SUBSCRIBE channel
redis發佈與訂閱詳解,剛好符合頭條的好友關注及推薦模式的應用

當三個客戶端都訂閱了channe1頻道後,我們通過PUBLISH命令給channe1發送信息,看看三個訂閱該頻道的客戶端,是否收到對應的信息,命令如下:

PUBLISH channel "hello redis"
redis發佈與訂閱詳解,剛好符合頭條的好友關注及推薦模式的應用

從上圖可以看出,當發送者對頻道發送信息時,三個客戶端都可以收到訂閱的信息。

redis發佈與訂閱常用命令:

1、Redis Subscribe 命令:用於訂閱頻道信息。如:

SUBSCRIBE channel

2、Redis Publish 命令:用於將信息發送到指定的頻道。如:

PUBLISH channel "hello redis sub/pub"

3、Redis Psubscribe 命令:用於訂閱一個或者多個按模糊條件匹配的頻道,類似SQL中的like。如:(表示訂閱所有以channel開始的所有頻道)

PSUBSCRIBE channel*

4、Redis Pubsub 命令:用於查看訂閱與發佈系統狀態,它由數個不同格式的子命令組成。比如查看活躍中的頻道有哪些、頻道的訂閱者數量?如:

Pubsub channels --活躍的頻道
PUBSUB NUMSUB channel--頻道channel的訂閱者數量
redis發佈與訂閱詳解,剛好符合頭條的好友關注及推薦模式的應用

5、Redis Punsubscribe 命令:用於退訂所有給定模式的頻道。如果沒有模式被指定,一個無參數的 PUNSUBSCRIBE 調用被執行,那麼客戶端訂閱的頻道都會被退訂。

PUNSUBSCRIBE channel

6、Redis Unsubscribe 命令:用於退訂給定的一個或多個頻道的信息。如果沒有指定頻道,那麼客戶端訂閱的所有頻道都會被退訂。

Unsubscribe 

總結:

1、redis的訂閱頻道的信息是redis服務器進程自己維持在​pubsub_channels鏈表字典當中。字典的KEY為被訂閱的頻道,值為訂閱的客戶端。

2、當發送者發送消息時,redis服務器遍歷頻道對應的所有客戶端,然後將消息發送到所訂閱的客戶端上。

3、當有信息發送時,除了訂閱該頻道的客戶端會收到消息,以及和訂閱了匹配頻道的客戶端,其它客戶端是收不到該信息的。

4、退訂頻道、退訂模式和訂閱頻道、訂閱模式是兩組反操作。

應用場景:

俗話說的好,知識學得好不好,還得看用到哪。反正筆者看到redis的發佈與訂閱的模式的特點後,第一時間想到的是可以用來做一個實時聊天系統,還可以用來做分佈式架構中寫的過程,利用redis的實時發佈功能,把要寫入的值及時快速的分發到各個寫入程序當中,保證分佈式架構中數據的完整一致性。再比如博客系統和自媒體平臺中,粉絲關注功能,就比如現在我的2000粉絲,當我發佈文章時,就可以及時推送文章到粉絲的客戶端上。總而言之,應用的場景比較多,需要大家多思考,多交流。

free教程,隨時隨地學習IT技術,歡迎關注交流


分享到:


相關文章: