Pub/Sub功能(即Publish,Subscribe)意思是發布及訂閱功能。簡單的理解就像我們訂閱blog一樣,不同的是,這里的客戶端與server端采用長連接建立推送機制,一個客戶端發布消息,可以在多個客戶端收到通知。
發布訂閱(pub/sub)是一種消息通信模式,主要的目的是解耦消息發布者和消息訂閱者之間的耦合,這點和設計模式中的觀察者模式比較相似。pub /sub不僅僅解決發布者和訂閱者直接代碼級別耦合也解決兩者在物理部署上的耦合。redis作為一個pub/sub server,在訂閱者和發布者之間起到了消息路由的功能。訂閱者可以通過subscribe和psubscribe命令向redis server訂閱自己感興趣的消息類型,redis將消息類型稱為通道(channel)。當發布者通過publish命令向redis server發送特定類型的消息時。訂閱該消息類型的全部client都會收到此消息。這里消息的傳遞是多對多的。一個client可以訂閱多個channel,也可以向多個channel發送消息。
客戶端一 在監聽tv1頻道 | 客戶端二 在監聽tv1和tv2多個頻道 | 發布者 |
> subscribe tv1 Reading messages... (press Ctrl-C to quit) 1) "subscribe" # 顯示訂閱成功 2) "tv1" # 訂閱的頻道(通道)名稱 3) (integer) 1 # 自己訂閱的頻道數量 |
> subscribe tv1 tv2 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "tv1" 3) (integer) 1 1) "subscribe" 2) "tv2" 3) (integer) 2 |
|
> publish tv1 1111111111111 (integer) 2 發布tv1頻道消息 返回int 2 表示有2個客戶端收到了tv1頻道消息 |
||
> subscribe tv1 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "tv1" 3) (integer) 1 1) "message" #有消息 2) "tv1" #收到消息頻道tv1 3) "1111111111111" #消息內容 |
> subscribe tv1 tv2 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "tv1" 3) (integer) 1 1) "subscribe" 2) "tv2" 3) (integer) 2 1) "message" #有消息 2) "tv1" #收到消息頻道tv1 3) "1111111111111" #消息內容 |
<-- 說明:兩客戶端均收到了tv1頻道消息。 |
> publish tv2 222222222222 (integer) 1 繼續發布tv2頻道消息 返回 int 1 表示有1個客戶端收到tv2頻道消息 |
||
> subscribe tv1 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "tv1" 3) (integer) 1 1) "message" 2) "tv1" 3) "1111111111111" |
> subscribe tv1 tv2 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "tv1" 3) (integer) 1 1) "subscribe" 2) "tv2" 3) (integer) 2 1) "message" 2) "tv1" 3) "1111111111111" 1) "message" #有消息 2) "tv2" #收到消息頻道tv2 3) "2222222222222" #消息內容 |
<-- 說明:因為客戶端一只訂閱了tv1頻道消息,其收不到此次tv2頻道的消息內容;而客戶端二訂閱了tv1和tv2兩個頻道消息,故而能收到tv2的消息; |