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