本文已收錄于專欄
《Redis精通系列》
上千人點贊收藏,全套Redis學習資料,大廠必備技能!
目錄
1、簡介
2、實體演示
2.1 普通訂閱
2.2 模式訂閱
3、Pub/Sub為什么被拋棄
1、簡介
李子捌把話說在前頭,如果你是面試或者為了了解知識來學習這一知識點,我覺得是有必要的;但是如果你是作為公司的技術負責人或者專案技術選型來使用Redis的Pub/Sub做訊息的發布訂閱,如果你不是走投無路了,那么你可能值得斟酌一下,Redis的Pub/Sub發布訂閱,是Redis一步步完善訊息佇列功能的一個進步點,雖然現在沒人用Pub/Sub做訊息佇列,但是它的思想和功能也是值得玩一下的,這個就是我寫這篇文章的主要原因,
?
Redis 發布訂閱 (pub/sub) 是一種訊息通信模式:發送者 (pub) 發送訊息,訂閱者 (sub) 接收訊息,
- pub -> publisher
- sub -> subscriber
Redis客戶端訂閱一個頻道非常簡單,它可以訂閱任意數量的頻道,
如下圖,Redis客戶端訂閱(subscriber)頻道(channel)

如下圖,當訊息發送到客戶端訂閱的頻道(channel)時,這個訊息就會被訂閱的所有未故障的客戶端接接收到

2、實體演示
演示Redis的發布訂閱,我們需要開啟多個客戶端,訂閱頻道(channel),
?
2.1 普通訂閱
如下我會啟動4個客戶端,第一個客戶端用來發布訊息,其他的用來訂閱頻道,接收訊息,

客戶端2、客戶端3、客戶端4同時訂閱news和weather頻道(channel)

客戶端1向頻道news/weather發布訊息

此時可以看到三個客戶端均接收客戶端1向頻道news/weather發布的訊息

2.2 模式訂閱
Redis為了方便同時訂閱多個模式的頻道,也有類似市面上常見的MQ中模式訂閱功能(如Rabbit MQ中的topic),這個功能可以匹配符的方式進行訂閱,
?
比如我需要訂閱以fund.開頭,任意字符結尾的頻道,就可以使用如下的訂閱方式
?

嘗試向fund.nuoan發布訊息

訂閱了fund.*的客戶端,成功接收到訊息

3、Pub/Sub為什么被拋棄
關于Redis的Pub/Sub為什么被拋棄,最主要的原因是它無法持久化,沒有實作持久化機制的Pub/Sub,無法做到訊息的不丟失,在客戶端宕機或者Redis服務宕機的情況下,都會導致訊息丟失,
- 客戶端宕機,客戶端無法接收訊息
- Redis服務宕機,沒有客戶端能連接上,肯定也無法接收到訊息
大部分情況下,我們都不會用到Redis去做訊息中間件,市面上成熟且好用的訊息中間件非常多,如果真的需要使用Redis來做訊息中間件,可以考慮Redis 5.0的新資料結構Stream,這個功能在Pub/Sub的基礎上,實作了持久化機制,并且大力借鑒了kafka的設計原理,完善了Redis用于實作訊息佇列的不足之處,
?
關于stream的知識點,請查看我的Redis專欄!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300441.html
標籤:其他
