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

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

生活随笔

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

数据库

Redis中的发布订阅模式

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

列表的局限

前面我們說(shuō)通過(guò)隊(duì)列的rpush 和lpop 可以實(shí)現(xiàn)消息隊(duì)列(隊(duì)尾進(jìn)隊(duì)頭出),但是消費(fèi)者需要不停地調(diào)用lpop 查看List 中是否有等待處理的消息(比如寫一個(gè)while 循環(huán))。為了減少通信的消耗,可以sleep()一段時(shí)間再消費(fèi),但是會(huì)有兩個(gè)問(wèn)題:

1、如果生產(chǎn)者生產(chǎn)消息的速度遠(yuǎn)大于消費(fèi)者消費(fèi)消息的速度,List 會(huì)占用大量的內(nèi)存。

2、消息的實(shí)時(shí)性降低。

list 還提供了一個(gè)阻塞的命令:blpop,沒(méi)有任何元素可以彈出的時(shí)候,連接會(huì)被阻塞。

blpop queue 5

基于list 實(shí)現(xiàn)的消息隊(duì)列,不支持一對(duì)多的消息分發(fā)。

發(fā)布訂閱模式

除了通過(guò)list 實(shí)現(xiàn)消息隊(duì)列之外,Redis 還提供了一組命令實(shí)現(xiàn)發(fā)布/訂閱模式。

這種方式,發(fā)送者和接收者沒(méi)有直接關(guān)聯(lián)(實(shí)現(xiàn)了解耦),接收者也不需要持續(xù)嘗試獲取消息。

?

訂閱頻道

首先,我們有很多的頻道(channel),我們也可以把這個(gè)頻道理解成queue。訂閱者可以訂閱一個(gè)或者多個(gè)頻道。消息的發(fā)布者(生產(chǎn)者)可以給指定的頻道發(fā)布消息。

只要有消息到達(dá)了頻道,所有訂閱了這個(gè)頻道的訂閱者都會(huì)收到這條消息。

需要注意的注意是,發(fā)出去的消息不會(huì)被持久化,因?yàn)樗呀?jīng)從隊(duì)列里面移除了,所以消費(fèi)者只能收到它開始訂閱這個(gè)頻道之后發(fā)布的消息。

下面我們來(lái)看一下發(fā)布訂閱命令的使用方法。

訂閱者訂閱頻道:可以一次訂閱多個(gè),比如這個(gè)客戶端訂閱了3 個(gè)頻道。

subscribe channel-1 channel-2 channel-3

發(fā)布者可以向指定頻道發(fā)布消息(并不支持一次向多個(gè)頻道發(fā)送消息):

publish channel-1 2673

取消訂閱(不能在訂閱狀態(tài)下使用):

unsubscribe channel-1

按規(guī)則(Pattern)訂閱頻道

支持?和*占位符。?代表一個(gè)字符,*代表0 個(gè)或者多個(gè)字符。

消費(fèi)端1,關(guān)注運(yùn)動(dòng)信息:

psubscribe *sport

消費(fèi)端2,關(guān)注所有新聞:

psubscribe news*

消費(fèi)端3,關(guān)注天氣新聞:

psubscribe news-weather

生產(chǎn)者,發(fā)布3 條信息

publish news-sport yaoming publish news-music jaychou publish news-weather rain public class MyListener extends JedisPubSub {// 取得訂閱的消息后的處理public void onMessage(String channel, String message) {System.out.println(channel + "=" + message);}// 初始化訂閱時(shí)候的處理public void onSubscribe(String channel, int subscribedChannels) {// System.out.println(channel + "=" + subscribedChannels);}// 取消訂閱時(shí)候的處理public void onUnsubscribe(String channel, int subscribedChannels) {// System.out.println(channel + "=" + subscribedChannels);}// 初始化按表達(dá)式的方式訂閱時(shí)候的處理public void onPSubscribe(String pattern, int subscribedChannels) {// System.out.println(pattern + "=" + subscribedChannels);}// 取消按表達(dá)式的方式訂閱時(shí)候的處理public void onPUnsubscribe(String pattern, int subscribedChannels) {// System.out.println(pattern + "=" + subscribedChannels);}// 取得按表達(dá)式的方式訂閱的消息后的處理public void onPMessage(String pattern, String channel, String message) {System.out.println(pattern + "=" + channel + "=" + message);} } public class ListenTest {public static void main(String[] args) {Jedis jedis = new Jedis("127.0.0.1", 6379);final MyListener listener = new MyListener();// 使用模式匹配的方式設(shè)置頻道// 會(huì)阻塞jedis.psubscribe(listener, new String[]{"qingshan-*"});} } public class PublishTest {public static void main(String[] args) {Jedis jedis = new Jedis("127.0.0.1", 6379);jedis.publish("qingshan-123", "666");jedis.publish("qingshan-abc", "pengyuyan");} }

?

總結(jié)

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

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