日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Redis发布与订阅——PUBLISH SUBSCRIBE

發(fā)布時(shí)間:2023/11/29 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis发布与订阅——PUBLISH SUBSCRIBE 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

Redis發(fā)布與訂閱——PUBLISH ?& SUBSCRIBE

一般來(lái)說(shuō),發(fā)布與訂閱(又稱(chēng)pub/sub)的特點(diǎn)是訂閱者(listener)負(fù)責(zé)訂閱頻道(channel),發(fā)送者(publisher)負(fù)責(zé)向頻道發(fā)送二進(jìn)制字符串消息(binary string message)。每當(dāng)有消息發(fā)送至給定頻道時(shí),頻道的訂閱者都會(huì)收到消息。我們也可以把頻道看作是電臺(tái),其中訂閱者可以同時(shí)收聽(tīng)多個(gè)電臺(tái),而發(fā)送者則可以在任何電臺(tái)發(fā)送消息。

發(fā)布與訂閱的模式

Redis 的 SUBSCRIBE 命令可以讓客戶(hù)端訂閱任意數(shù)量的頻道, 每當(dāng)有新信息發(fā)送到被訂閱的頻道時(shí), 信息就會(huì)被發(fā)送給所有訂閱指定頻道的客戶(hù)端。

作為例子, 下圖展示了頻道 channel1 , 以及訂閱這個(gè)頻道的三個(gè)客戶(hù)端 —— client2 、 client5 和 client1 之間的關(guān)系:

當(dāng)有新消息通過(guò) PUBLISH 命令發(fā)送給頻道 channel1 時(shí), 這個(gè)消息就會(huì)被發(fā)送給訂閱它的三個(gè)客戶(hù)端:


發(fā)布與訂閱相關(guān)命令

訂閱和發(fā)布

首先打開(kāi)一個(gè)cli,訂閱一個(gè)頻道,如下,

127.0.0.1:7000>?subscribe?mychannel Reading?messages...?(press?Ctrl-C?to?quit) 1)?"subscribe" 2)?"mychannel" 3)?(integer)?1

然后向該頻道發(fā)送一個(gè)消息,如下,

127.0.0.1:7000>?publish?mychannel?'hell?world' (integer)?1 127.0.0.1:7000>

剛才的客戶(hù)端已經(jīng)訂閱了該頻道,所以該頻道就會(huì)收到消息,如下,

???~?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——退訂給定的一個(gè)或多個(gè)頻道,如果執(zhí)行是沒(méi)有給定任何頻道,那么退訂所有頻道

PSUBSCRIBE——PSUBSCRIBE pattern [pattern ...] 訂閱與給定模式相匹配的所有頻道

PUNSUBSCRIBE——PUNSUBSCRIBE ?[pattern [pattern ...]] 退訂給定的模式,如果執(zhí)行是沒(méi)有給定任何模式,那么退訂所有模式。


使用Jedis客戶(hù)端實(shí)現(xiàn)發(fā)布與訂閱

首先實(shí)現(xiàn)一個(gè)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);}} }

寫(xiě)一個(gè)測(cè)試類(lèi),實(shí)現(xiàn)訂閱和發(fā)布,

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;/***?發(fā)布和訂閱的頻道*/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);}/***?發(fā)布9次消息后,在此發(fā)送quit消息,使listener(訂閱者)關(guān)閉*/@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=========

轉(zhuǎn)載于:https://my.oschina.net/xinxingegeya/blog/658220

總結(jié)

以上是生活随笔為你收集整理的Redis发布与订阅——PUBLISH SUBSCRIBE的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。