【Redis 系列】redis 學習九,Redis 的釋出和訂閱是咋玩的
Redis 釋出訂閱
Redis 釋出訂閱(pub / sub)是一種訊息通訊模式
- 傳送者傳送訊息 pub
- 接受者訂閱訊息 sub
例如微信,微博這樣的關注系統
Redis 的客戶端可以訂閱任意數量的頻道,不受限制
來看看圖示
- 訊息釋出者
- 訊息訂閱者
- 頻道
這裡的訊息釋出者,和訊息訂閱者都是 redis 客戶端, 訂閱者訂閱某個頻道,釋出者在該頻道中釋出相關資訊,例如文章,例如沸點,等等,訊息訂閱者就能實時收到剛才釋出者傳送的內容了
如下圖中,頻道 channel1
以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關係:
當有新訊息通過 PUBLISH 命令傳送給頻道 channel1 時
這個訊息就會被髮送給訂閱它的三個客戶端:
常用命令
下表列出了 redis 釋出訂閱常用命令:
序號 | 命令及描述 |
---|---|
1 | PSUBSCRIBE pattern [pattern ...] 訂閱一個或多個符合給定模式的頻道。 |
2 | PUBSUB subcommand [argument [argument ...] 檢視訂閱與釋出系統狀態。 |
3 | PUBLISH channel message 將資訊傳送到指定的頻道。 |
4 | [PUNSUBSCRIBE [pattern [pattern ...] 退訂所有給定模式的頻道。 |
5 | SUBSCRIBE channel [channel ...] 訂閱給定的一個或多個頻道的資訊。 |
6 | UNSUBSCRIBE [channel [channel ...] 指退訂給定的頻道。 |
實際測試和驗證
- subscribe channel [channel ...]
訂閱一個或者多個通道
- PUBLISH channel message
向頻道中傳送訊息
接收端:
接收端訂閱 xiaomotong 頻道,只要傳送端有 publish 訊息到頻道中,接收端就能馬上收到
127.0.0.1:6379> subscribe xiaomotong Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "xiaomotong" 3) (integer) 1 1) "message" 2) "xiaomotong" 3) "hellowrold" 1) "message" 2) "xiaomotong" 3) "hello_redis" 1) "message" 2) "xiaomotong" 3) "xiaozhupeiqi"
傳送端:
傳送端向 xiaomotong 頻道依次傳送 message ,hellowrold,hello_redis,xiaozhupeiqi
root@iZuf66y3tuzn4wp3h02t7pZ:~# redis-cli
127.0.0.1:6379> publish xiaomotong hellowrold
(integer) 1
127.0.0.1:6379> publish xiaomotong hello_redis
(integer) 1
127.0.0.1:6379> publish xiaomotong xiaozhupeiqi
(integer) 1
那麼這個實現的原理是啥呢?
實現原理
redis 是 C 語言實現的,單程序的開源元件
通過分析 redis 原始碼裡面的 publish.c 檔案,我們可以瞭解到 redis 釋出訂閱的底層實現,這能加深我們對 redis 的理解
redis 通過 publish ,subscribe 和 psubscribe 等命令來實現釋出和訂閱功能
例如我們每個人都會使用的微信:
subscribe
通過 subscribe 訂閱某個頻道後,redis-server 內部會維護一個字典,字典的鍵就是這個頻道的名字,而字典的值是一個連結串列,這個連結串列裡面儲存了所有訂閱這個頻道的客戶端
因此,我們就知道,subscribe 指令就是將客戶端新增到頻道的訂閱連結串列裡面
publish
redis 通過 publish 向頻道中傳送訊息,redis-server 會使用給定的鍵作為頻道的名字,在它自己維護的頻道字典裡面記錄了訂閱這個頻道所有的客戶端的連結串列,遍歷這個連結串列,將訊息傳送給所有的訂閱者
pub / sub
pub / sub 見名知意就是釋出(publish)和訂閱(subscribe)
在 redis 裡面,我們可以設定對某一個 key 值,進行訊息釋出及訊息訂閱,當在一個 key 值上面進行了訊息釋出後,所有訂閱他的客戶端都會收到它剛才釋出的訊息,這一功能最明顯的用法就是用作實時訊息系統
例如我們平常都會使用到的聊天系統,即時通訊系統等等
但是這裡我們需要注意
Redis 叢集為了實現所有訂閱的客戶端都可以接收到釋出的訊息,但是不同的客戶端可能連線的是不同的主節點,為此 redis 會廣播所有的釋出的訊息到所有的節點,如果釋出的訊息較大,網路開銷將會很大,因此需要避免傳送大訊息
Redis 釋出/訂閱應用場景
1、實時訊息系統
2、即時通訊,頻道作為聊天室,將資訊回顯給訂閱頻道的所有人
3、訂閱系統,關注系統都是 ok 的
對於複雜的場景,我們就不用考慮 redis 了,可以直接使用專業的 MQ 開源元件,例如 rabbitMQ 或者 kafka
使用 Redis 釋出/訂閱 需要注意的點
使用 Redis 釋出/訂閱是有缺陷的
1、對於訊息處理可靠性要求不強
2、消費能力無需通過增加消費方進行增強
參考資料:
歡迎點贊,關注,收藏
朋友們,你的支援和鼓勵,是我堅持分享,提高質量的動力
好了,本次就到這裡
技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。
我是小魔童哪吒,歡迎點贊關注收藏,下次見~