Redis發布訂閱機制

2021-08-22 03:28:04 字數 3273 閱讀 2774

redis是乙個開源的記憶體資料庫,它以鍵值對的形式儲存資料。由於資料儲存在記憶體中,因此redis的速度很快,但是每次重啟redis服務時,其中的資料也會丟失,因此,redis也提供了持久化儲存機制,將資料以某種形式儲存在檔案中,每次重啟時,可以自動從檔案載入資料到記憶體當中。 

redis的架構包括兩個部分:redis client和redis server。redis客戶端負責向伺服器端傳送請求並接受來自伺服器端的響應。伺服器端負責處理客戶端請求,例如,儲存資料,修改資料等。 

redis通常用作資料庫,快取以及訊息系統。

redis提供了發布訂閱功能,可以用於訊息的傳輸,redis的發布訂閱機制包括三個部分,發布者,訂閱者和channel。 

發布者和訂閱者都是redis客戶端,channel則為redis伺服器端,發布者將訊息傳送到某個的頻道,訂閱了這個頻道的訂閱者就能接收到這條訊息。redis的這種發布訂閱機制與基於主題的發布訂閱類似,channel相當於主題。

(1)傳送訊息 

redis採用publish命令傳送訊息,其返回值為接收到該訊息的訂閱者的數量。 

(2)訂閱某個頻道 

redis採用subscribe命令訂閱某個頻道,其返回值包括客戶端訂閱的頻道,目前已訂閱的頻道數量,以及接收到的訊息,其中subscribe表示已經成功訂閱了某個頻道。 

(3)模式匹配 

模式匹配功能允許客戶端訂閱符合某個模式的頻道,redis採用psubscribe訂閱符合某個模式所有頻道,用「」表示模式,「」可以被任意值代替。 

假設客戶端同時訂閱了某種模式和符合該模式的某個頻道,那麼傳送給這個頻道的訊息將被客戶端接收到兩次,只不過這兩條訊息的型別不同,乙個是message型別,乙個是pmessage型別,但其內容相同。 

(4)取消訂閱 

redis採用unsubscribe和punsubscribe命令取消訂閱,其返回值與訂閱類似。 

由於redis的訂閱操作是阻塞式的,因此一旦客戶端訂閱了某個頻道或模式,就將會一直處於訂閱狀態直到退出。在subscribe,psubscribe,unsubscribe和punsubscribe命令中,其返回值都包含了該客戶端當前訂閱的頻道和模式的數量,當這個數量變為0時,該客戶端會自動退出訂閱狀態。

由於redis是乙個開源的系統,因此我們可以通過其源**檢視內部的實現細節。 

當客戶端訂閱某個頻道時,redis需要將該頻道和該客戶端繫結。首先,在客戶端結構體client中,有乙個屬性為pubsub_channels,該屬性表明了該客戶端訂閱的所有頻道,它是乙個字典型別,通過雜湊表實現,其中的每個元素都包含了乙個鍵值對以及指向下乙個元素的指標,每次訂閱都要向其中插入乙個結點,鍵表示訂閱的頻道,值為空。然後,在表示伺服器端的結構體redisserver中,也有乙個屬性為pubsub_channels,但此處它表示的是該伺服器端中的所有頻道以及訂閱了這個頻道的客戶端,它也是乙個字典型別,插入結點時,鍵表示頻道,值則是訂閱了這個頻道的所有客戶端組成的鍊錶。最後redis通知客戶端其訂閱成功。 

當客戶端訂閱某個模式時,redis同樣需要將該模式和該客戶端繫結。首先,在結構體client中,有乙個屬性為pubsub_patterns,該屬性表示該客戶端訂閱的所有模式,它是乙個鍊錶型別,每個結點包括了訂閱的模式和指向下乙個結點的指標,每次訂閱某個模式時,都要向其中插入乙個結點。然後,在結構體redisserver中,有乙個屬性也叫pubsub_patterns,它表示了該伺服器端中的所有模式和訂閱了這些模式的客戶端,它也是乙個鍊錶型別,插入結點時,每個結點都要包含訂閱的模式,以及訂閱這個模式的客戶端,和指向下乙個結點的指標。 

當客戶端向某個頻道傳送訊息時,redis首先在結構體redisserver中的pubsub_channels中找出鍵為該頻道的結點,遍歷該結點的值,即遍歷訂閱了該頻道的所有客戶端,將訊息傳送給這些客戶端。然後,遍歷結構體redisserver中的pubsub_patterns,找出包含該頻道的模式的結點,將訊息傳送給訂閱了該模式的客戶端。

redis的發布訂閱功能與redis中的資料儲存時無關的,它不會影響redis的key space,即不會影響redis中儲存的資料,但通過發布訂閱機制,redis還提供了另乙個功能,即keyspace notification,允許客戶端通過訂閱特定的頻道,從而得知是否有改變redis中的資料的事件。例如,有乙個客戶端刪除了redis中鍵為mykey的資料,該操作會觸發兩條訊息,mykey del和del mykey,前者屬於頻道keysapce,表示keyspace發生的變化,後者屬於頻道keyevent,表示執行的操作。 

(1)activemq支援多種訊息協議,包括amqp,mqtt,stomp等,並且支援jms規範,但redis沒有提供對這些協議的支援; 

(2)activemq提供持久化功能,但redis無法對訊息持久化儲存,一旦訊息被傳送,如果沒有訂閱者接收,那麼訊息就會丟失; 

(3)activemq提供了訊息傳輸保障,當客戶端連線超時或事務回滾等情況發生時,訊息會被重新傳送給客戶端,redis沒有提供訊息傳輸保障。 

總之,activemq所提供的功能遠比redis發布訂閱要複雜,畢竟redis不是專門做發布訂閱的,但是如果系統中已經有了redis,並且需要基本的發布訂閱功能,就沒有必要再安裝activemq了,因為可能activemq提供的功能大部分都用不到,而redis的發布訂閱機制就能滿足需求。

Redis 發布訂閱機制詳解

程序間的一種訊息通訊模式 傳送者 pub 傳送訊息,訂閱者 sub 接收訊息。聯想諸多訊息中介軟體的發布訂閱模式,但是redis大多用來作為基於記憶體的分布式快取,企業中訊息中介軟體多用activemq ribbitmq等。下圖展示了頻道channel1,以及訂閱這個頻道的三個客戶端 client2...

Redis之發布 訂閱機制

相關命令 publish 發布 subscribe 訂閱 psubscribe 一種訂閱符合給定模式的所有頻道的方法 unsubscribe 退訂 punsubscribe 退訂乙個訂閱的模式這些命令被廣泛用於構建即時通訊應用,比如網路聊天室 chatroom 和實時廣播 實時提醒等。redis相關...

Redis 發布訂閱

redis 發布訂閱 pub sub 是一種訊息通訊模式 傳送者 pub 傳送訊息,訂閱者 sub 接收訊息。redis 客戶端可以訂閱任意數量的頻道。下圖展示了頻道 channel1 以及訂閱這個頻道的三個客戶端 client2 client5 和 client1 之間的關係 當有新訊息通過 pu...