發布/訂閱模式的原型是這樣的:有兩類主體,生產者和消費者,生產者會將需要處理的任務放到任務隊列中,而消費者則不斷地從任務隊列中讀取任務並執行。生產者和消費者只需要提前定義好任務隊列的格式,雙方並不需要瞭解對方的實現細節。由於雙方是基於任務隊列進行互動的,所以,新增生產者或新增消費者都比較容易。總的來說,發布/訂閱模式具有松耦合、易於擴充的特性。 通過PUBLISH和SUBSCRIBE命令實現發布/訂閱
redis對發布/訂閱模式提供了非常好的支援,提供了PUBLISH和SUBSCRIBE兩個命令,可以輕鬆地實現多個用戶端之間的發布和訂閱。首先開啟一個redis-cli用戶端,這個用戶端作為消費者,來訂閱一個頻道的訊息
redis 127.0.0.1:6379> SUBSCRIBE channel1Reading messages... (press Ctrl-C to quit)1) "subscribe"2) "channel1"3) (integer) 1
我們訂閱了channel1頻道,然後消費者程式阻塞,進入監聽模式。
然後我們在開啟一個redis-cli用戶端,作為生產者,發布訊息
redis 127.0.0.1:6379> PUBLISH channel1 hello(integer) 1
我們向channel1發布了一個訊息“hello”,傳回值為1,表示一個消費者收到了訊息。此時,我們的消費者用戶端監聽到了訊息並輸出了一下內容
1) "message"2) "channel1"3) "hello"
按照規則訂閱
除了SUBSCRIBE命令外,redis還提供了PSUBSCRIBE命令,該命令支援通過blob風格的萬用字元格式來訂閱頻道。我們開啟一個新的redis-cli用戶端,通過PSUBSCRIBE命令監聽channel*隊列
redis 127.0.0.1:6379> PSUBSCRIBE channel*Reading messages... (press Ctrl-C to quit)1) "psubscribe"2) "channel*"
然後開啟生產者用戶端,分別向channel1和channel2頻道發布訊息
redis 127.0.0.1:6379> PUBLISH channel1 hello(integer) 1redis 127.0.0.1:6379> PUBLISH channel2 hello(integer) 1
這時,我們的消費者用戶端監聽到了兩條訊息,然後輸出
1) "pmessage"2) "channel*"3) "channel1"4) "hello"1) "pmessage"2) "channel*"3) "channel2"4) "hello"
從消費者的輸出中可以看出來,redis分別返回了PSUBSCRIBE監聽的頻道、收到訊息的具體頻道以及訊息內容。