Redis高级实用特性:发布及订阅消息
在之前的文章中,介紹過Redis數據庫高級實用特性中的持久化機制,今天為大家介紹Redis的另一高級實用特性——發布及訂閱消息。
發布訂閱(pub/sub)是一種消息通信模式,主要的目的是解耦消息發布者和消息訂閱者之間的耦合,這點和設計模式中的觀察者模式比較相似。pub/sub不僅僅解決發布者和訂閱者直接代碼級別耦合也解決兩者在物理部署上的耦合。redis作為一個pub/sub的server,在訂閱者和發布者之間起到了消息路由的功能。訂閱者可以通過subscribe和psubscribe命令向redis server訂閱自己感興趣的消息類型,redis將消息類型稱為通道(channel)。當發布者通過publish命令向redis server發送特定類型的消息時。訂閱該消息類型的全部client都會收到此消息。這里消息的傳遞是多對多的。一個client可以訂閱多個channel,也可以向多個channel發送消息。
下面做個實驗。這里使用3不同的client, client1用于訂閱tv1這個channel的消息,client2用于訂閱tv1和tv2這2個chanel的消息,client3用于發布tv1和tv2的消息。
?
| ? | ? | Client 1 | Client 2 | Client 3 |
| ? | ? | redis 127.0.0.1:6379>subscribe tv1 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "tv1" 3) (integer) 1 | redis 127.0.0.1:6379>subscribe tv1 tv2 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "tv1" 3) (integer) 1 1) "subscribe" 2) "tv2" 3) (integer) 2 | |
| ? | ? | redis 127.0.0.1:6379>publish tv1 program1 (integer) 2 redis 127.0.0.1:6379> | ||
| ? | ? | redis 127.0.0.1:6379> subscribe tv1 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "tv1" 3) (integer) 1 1) "message" 2) "tv1" 3) "program1" | redis 127.0.0.1:6379> 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) "program1" | |
| ? | ? | redis 127.0.0.1:6379>publish tv2 program2 (integer) 1 redis 127.0.0.1:6379> | ||
| ? | ? | redis 127.0.0.1:6379> subscribe tv1 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "tv1" 3) (integer) 1 1) "message" 2) "tv1" 3) "program1" | redis 127.0.0.1:6379> 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) "program1" 1) "message" 2) "tv2" 3) "program2" |
?
下面將詳細的解釋一下上面的例子
1、client1訂閱了tv1這個channel這個頻道的消息,client2訂閱了tv1和tv2這2個頻道的消息
2、client3 是用于發布tv1和tv2這2個頻道的消息發布者
3、接下來我們在client3發布了一條消息”publish tv1 program1”,大家可以看到這條消息是發往tv1這個頻道的
4、理所當然的client1和client2都接收到了這個頻道的消息
5、 然后client3又發布了一條消息”publish tv2 program2”,這條消息是發往tv2的,由于client1并沒有訂閱tv1,所以client1的結果中并沒有顯示出任何結果,但client2訂閱了這個頻道,所以client2是會有返回結果的。
我們也可以用psubscribe tv*的方式批量訂閱以tv開頭的頻道的內容。
看完這個小例子后應該對pub/sub功能有了一個感性的認識。需要注意的是當一個連接通過subscribe或者psubscribe訂閱通道后就進入訂閱模式。在這種模式除了再訂閱額外的通道或者用unsubscribe或者punsubscribe命令退出訂閱模式,就不能再發送其他命令。另外使用 psubscribe命令訂閱多個通配符通道,如果一個消息匹配上了多個通道模式的話,會多次收到同一個消息。
轉載于:https://www.cnblogs.com/eefeng/archive/2013/05/14/3077126.html
總結
以上是生活随笔為你收集整理的Redis高级实用特性:发布及订阅消息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone5S A1528 使用移动4
- 下一篇: Q_INIT_RESOURE