Redis发布与订阅——PUBLISH SUBSCRIBE
2019獨角獸企業重金招聘Python工程師標準>>>
Redis發布與訂閱——PUBLISH ?& SUBSCRIBE
一般來說,發布與訂閱(又稱pub/sub)的特點是訂閱者(listener)負責訂閱頻道(channel),發送者(publisher)負責向頻道發送二進制字符串消息(binary string message)。每當有消息發送至給定頻道時,頻道的訂閱者都會收到消息。我們也可以把頻道看作是電臺,其中訂閱者可以同時收聽多個電臺,而發送者則可以在任何電臺發送消息。
發布與訂閱的模式
Redis 的 SUBSCRIBE 命令可以讓客戶端訂閱任意數量的頻道, 每當有新信息發送到被訂閱的頻道時, 信息就會被發送給所有訂閱指定頻道的客戶端。
作為例子, 下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關系:
當有新消息通過 PUBLISH 命令發送給頻道 channel1 時, 這個消息就會被發送給訂閱它的三個客戶端:
發布與訂閱相關命令
訂閱和發布
首先打開一個cli,訂閱一個頻道,如下,
127.0.0.1:7000>?subscribe?mychannel Reading?messages...?(press?Ctrl-C?to?quit) 1)?"subscribe" 2)?"mychannel" 3)?(integer)?1然后向該頻道發送一個消息,如下,
127.0.0.1:7000>?publish?mychannel?'hell?world' (integer)?1 127.0.0.1:7000>剛才的客戶端已經訂閱了該頻道,所以該頻道就會收到消息,如下,
???~?redis-cli?-p?7000 127.0.0.1:7000>?subscribe?mychannel Reading?messages...?(press?Ctrl-C?to?quit) 1)?"subscribe" 2)?"mychannel" 3)?(integer)?1 1)?"message" 2)?"mychannel" 3)?"hell?world"其他命令:
UNSUBSCRIBE——退訂給定的一個或多個頻道,如果執行是沒有給定任何頻道,那么退訂所有頻道
PSUBSCRIBE——PSUBSCRIBE pattern [pattern ...] 訂閱與給定模式相匹配的所有頻道
PUNSUBSCRIBE——PUNSUBSCRIBE ?[pattern [pattern ...]] 退訂給定的模式,如果執行是沒有給定任何模式,那么退訂所有模式。
使用Jedis客戶端實現發布與訂閱
首先實現一個Listener,用于訂閱消息,接收消息,
package?com.usoft.jedis.sample;import?redis.clients.jedis.JedisPubSub;/***?Created?by?xinxingegeya?on?16/4/13.*/ public?class?MessageListener?extends?JedisPubSub?{@Overridepublic?void?onMessage(String?channel,?String?message)?{System.out.println("channel:"?+?channel?+?",message:"?+?message);//此處我們可以取消訂閱if?(message.equalsIgnoreCase("quit"))?{this.unsubscribe(channel);}} }寫一個測試類,實現訂閱和發布,
package?com.usoft.jedis.sample;import?org.junit.After; import?org.junit.Before; import?org.junit.Test; import?redis.clients.jedis.Jedis; import?redis.clients.jedis.JedisPool; import?redis.clients.jedis.JedisPoolConfig;/***?Created?by?xinxingegeya?on?16/4/13.*/ public?class?PubSubTest?{/***?jedis連接池*/public?JedisPool?jedisPool;/***?發布和訂閱的頻道*/public?String?channel?=?"mychannel";@Beforepublic?void?before()?{JedisPoolConfig?config?=?new?JedisPoolConfig();config.setMaxTotal(10);config.setMaxIdle(5);config.setMaxWaitMillis(5000);config.setTestOnBorrow(true);jedisPool?=?new?JedisPool(config,?"127.0.0.1",?7000);}@Afterpublic?void?after()?{jedisPool.close();}@Testpublic?void?subscribe()?{Jedis?jedis?=?jedisPool.getResource();jedis.subscribe(new?MessageListener(),?channel);}/***?發布9次消息后,在此發送quit消息,使listener(訂閱者)關閉*/@Testpublic?void?publish()?{Jedis?jedis?=?jedisPool.getResource();for?(int?i?=?0;?i?<?10;?i++)?{if?(i?==?9)?{jedis.publish(channel,?"quit");}?else?{jedis.publish(channel,?"hello?world");}}} }=========END=========
轉載于:https://my.oschina.net/xinxingegeya/blog/658220
總結
以上是生活随笔為你收集整理的Redis发布与订阅——PUBLISH SUBSCRIBE的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做梦梦到房子着火了什么预兆
- 下一篇: 【Data Cluster】真机环境下M