国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

解鎖 Redis 發布訂閱模式:通過實踐演示挖掘消息通信潛能

開發
本文從Redis發布訂閱模型基本介紹和幾個實踐案例角度帶讀者快速入門了一下redis發布訂閱模型的使用場景以及一些注意事項,希望對你有幫助。

Redis 的發布訂閱模式,正是這樣一把強大的“通信鑰匙”,它為開發者們開啟了一扇實現高效消息交互的大門。通過發布訂閱模式,一個消息生產者可以將消息發布到指定的頻道中,而多個對該頻道感興趣的消息消費者能夠同時接收到這些消息,實現了消息的一對多廣播。

在本文中,我們將通過詳細的實踐演示,深入探索 Redis 發布訂閱模式的奧秘。從基礎概念的簡要回顧,到搭建環境、編寫代碼示例,再到對運行結果的詳細分析,一步步帶你領略這一強大模式在實際項目中的應用魅力,讓你在面對類似的消息通信需求時能夠游刃有余。

一、詳解redis發布訂閱模式

1. 什么是發布與訂閱

redis發布訂閱是一種解耦生產者和消費者一種消息通信模式,訂閱者通過訂閱channel等待最新的消息,發布者按需將消息發送到指定channel上供訂閱者消費:

2. redis發布訂閱模式的使用

3. redis發布訂閱的兩種模式

redis發布訂閱有兩種方式:

  • 基于精確頻道的訂閱模式,即訂閱者訂閱名為channel-1的頻道,那么只有channel-1有消息時才會通知這些訂閱。
  • 基于匹配模型的訂閱模式,即訂閱者可以通過表達式訂閱頻道,例如訂閱者訂閱了channel*的頻道,那么所有前綴為channel的頻道都會向這個訂閱者發布消息。

4. 基于頻道的訂閱模式

基于頻道訂閱模式的指令格式如下,可以看到訂閱者可以訂閱多個頻道

subscribe channel [channel ...]

所以我們開啟一個redis客戶端,訂閱一個channel:sport的頻道,對應的指令和輸出結果如下,可以看到發送指令后redis服務端返回1,通知訂閱者成功訂閱該頻道:

# 客戶端1 訂閱 channel:sport
127.0.0.1:6379> SUBSCRIBE channel:sport
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel:sport"
3) (integer) 1

對應的我們也給出發布消息的指令格式:

publish channel message

此時,我們再開啟一個redis客戶端,發布一條消息到channel:sport的頻道:

# 另一個客戶端發送消息
127.0.0.1:6379> PUBLISH channel:sport "this is why we play"
(integer) 1
127.0.0.1:6379>

此時剛剛訂閱消息的redis客戶端就會實時的收到這條消息:

5. 基于匹配模式的發布與訂閱示例

有時候我們會訂閱多個頻道,我們不可能每次都去手動增加訂閱的頻道,例如我們當前訂閱頻道有:c1、c2、c3、c4、c5、c6、c7、c8。將來還可能出現c9等情況。我們不可能實時去添加訂閱的頻道。 觀察上面的頻道我們發現頻道都是以c開頭,后續的數字不斷變化,所以我們完全可以使用模式匹配來實現頻道訂閱。

模式訂閱和取消的命令為:

psubscribe pattern [pattern...]
punsubscribe [pattern [pattern ...]]

關于parttern常見的匹配符有:

  • :表示任意占位符,例如c,可以匹配c、c1、c111
  • ?*:匹配一個及以上個占位符
  • ?:表示匹配一個占位符

我們希望訂閱c1-c9的頻道基于模式匹配我們就能夠做到這一點。

我們首先開啟一個客戶端,使用模式匹配發起訂閱:

# 訂閱匹配cxx相關的模式
PSUBSCRIBE c?*

然后我們在開啟另一個客戶端,發送消息到c1頻道:

127.0.0.1:6379> PUBLISH c1 "this is c1 message"
(integer) 1
127.0.0.1:6379>

剛剛訂閱的客戶端就會收到消息:

127.0.0.1:6379> PSUBSCRIBE c?*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "c?*"
3) (integer) 1
1) "pmessage"
2) "c?*"
3) "c1"
4) "this is c1 message"

注意:當你訂閱PSUBSCRIBE c?* c1訂閱時,若另一個客戶端發送消息到c1你會收到兩條消息(原因會在后文源碼解析時補充)。

如下便是PSUBSCRIBE c?* c1的收到PUBLISH c1 "this is c1 message"的消息內容:

# 訂閱c?* 和精確的c1兩個頻道
127.0.0.1:6379> PSUBSCRIBE c?* c1
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "c?*"
3) (integer) 1
1) "psubscribe"
2) "c1"
3) (integer) 2
1) "pmessage"
2) "c1"
3) "c1"
4) "this is c1 message"
1) "pmessage"
2) "c?*"
3) "c1"
4) "this is c1 message"

6. 基于spring boot集成redis落地發布與訂閱模式

我們將使用一個用戶訂閱channel:sport,一個用戶訂閱channel:stock,而另一個用戶則通過channel*訂閱兩個都訂閱:

了解了大體思路,我們就開始落地這個需求,首先第一步還是引入redis的依賴:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
  </dependency>

然后在配置文件中給出redis文件的配置信息:

spring.redis.host=127.0.0.1
spring.redis.port=6379

隨后就是定義3個訂閱者的處理器的通用接口定義,后續我們將通過函數時編程來分別落地3個訂閱者的處理器:

public interface RedisMsgHandler {

    /**
     * 處理發布者發送的消息
     * @param message
     */
    void handleMessage(String message);
}

然后我們就可以針對redis不同的訂閱者進行配置進行聲明:

@Configuration
@EnableCaching
@Slf4j
public class RedisConfig {
    /**
     * Redis消息監聽器容器
     *
     * @param connectionFactory
     * @return
     */
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //訂閱體育消息
        container.addMessageListener(listenerAdapter(msg -> log.info("收到體育新聞,消息內容:{}", msg)), new PatternTopic("channel:sport"));
        //訂閱股票消息
        container.addMessageListener(listenerAdapter(msg -> log.info("收到庫存消息,消息內容:{}", msg)), new PatternTopic("channel:stock"));
        //channel前綴的消息都訂閱
        container.addMessageListener(listenerAdapter(msg -> log.info("收到channel前綴的消息:{}", msg)), new PatternTopic("channel:*"));
        return container;
    }

    /**
     * 配置消息接收處理類
     *
     * @return
     */

    @Bean
    @Scope("prototype")
    MessageListenerAdapter listenerAdapter(RedisMsgHandler handler) {
        //這個地方 是給messageListenerAdapter 傳入一個消息接受的處理器,利用反射的方法調用“receiveMessage”
        //也有好幾個重載方法,這邊默認調用處理器的方法 叫 handleMessage 可以自己到源碼里面看
        return new MessageListenerAdapter(handler, "handleMessage");//注意2個通道調用的方法都要為 receiveMessage
    }
    

}

最后我們啟動一個定時器定時向頻道發送消息:

@EnableScheduling
@Component
public class SenderTask {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    //向redis消息隊列index通道發布消息
    @Scheduled(fixedRate = 2000)
    public void sendMessage() {
        stringRedisTemplate.convertAndSend("channel:stock", "股票漲了"+Math.random()+"個百分點");
        stringRedisTemplate.convertAndSend("channel:sport",  "籃球新聞 No."+((int)(Math.random()*100)+1)+"選手得分");
    }
}

最后運行結果如下所示:

2025-01-11 22:39:03.129  INFO 16952 --- [    container-3] com.sharkChili.RedisConfig               : 收到channel前綴的消息:股票漲了0.5562952653668436個百分點
2025-01-11 22:39:03.129  INFO 16952 --- [    container-4] com.sharkChili.RedisConfig               : 收到體育新聞,消息內容:籃球新聞 No.20選手得分
2025-01-11 22:39:03.129  INFO 16952 --- [    container-5] com.sharkChili.RedisConfig               : 收到channel前綴的消息:籃球新聞 No.20選手得分
2025-01-11 22:39:05.121  INFO 16952 --- [    container-6] com.sharkChili.RedisConfig               : 收到庫存消息,消息內容:股票漲了0.47411355078897777個百分點
2025-01-11 22:39:05.122  INFO 16952 --- [    container-7] com.sharkChili.RedisConfig               : 收到channel前綴的消息:股票漲了0.47411355078897777個百分點
2025-01-11 22:39:05.135  INFO 16952 --- [    container-9] com.sharkChili.RedisConfig               : 收到channel前綴的消息:籃球新聞 No.15選手得分
2025-01-11 22:39:05.135  INFO 16952 --- [    container-8] com.sharkChili.RedisConfig               : 收到體育新聞,消息內容:籃球新聞 No.15選手得分
2025-01-11 22:39:07.135  INFO 16952 --- [   container-11] com.sharkChili.RedisConfig               : 收到channel前綴的消息:股票漲了0.886860372468581個百分點
2025-01-11 22:39:07.135  INFO 16952 --- [   container-10] com.sharkChili.RedisConfig               : 收到庫存消息,消息內容:股票漲了0.886860372468581個百分點
2025-01-11 22:39:07.136  INFO 16952 --- [   container-12] com.sharkChili.RedisConfig               : 收到體育新聞,消息內容:籃球新聞 No.89選手得分
2025-01-11 22:39:07.136  INFO 16952 --- [   container-13] com.sharkChili.RedisConfig               : 收到channel前綴的消息:籃球新聞 No.89選手得分

7. 發布訂閱的常見的使用場景和優缺點

使用場景如:聊天室、公告牌、異步處理電商訂單非核心操作等需要實現消息解耦的場景都可以使用消息訂閱發布,如下所示,這就是電商下單業務對于redis發布訂閱模式的使用模型圖:

當然redis發布訂閱模式優缺點也很明顯,我們先來說說優點,redis發布訂閱模式 實現簡單,對于簡單的解耦生產者和消費者關系的應用場景綽綽有余,而缺點也是一樣,因為redis發布訂閱模式實現比較簡單,并沒有持久化機制無法保證可靠消費和故障恢復,同時,相較于Kafka、RocketMQ,Redis的實現略顯粗糙,無法實現消息堆積與回溯。

二、redis如何實現發布訂閱模型

關于redis發布訂閱模型,對于底層實現感興趣的讀者,可以參考筆者下面這篇關于pub/sub的源碼解析:《聊聊 Redis 的發布訂閱設計與實現

三、小結

本文從redis發布訂閱模型基本介紹和幾個實踐案例角度帶讀者快速入門了一下redis發布訂閱模型的使用場景以及一些注意事項,希望對你有幫助。

責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關推薦

2009-11-05 10:07:37

WCF設計模式

2018-05-09 09:35:13

2024-10-11 11:50:05

Redis適用場景

2024-07-29 08:34:18

C++訂閱者模式線程

2022-08-15 09:02:22

Redis模式訂閱消息

2023-12-04 08:24:23

2024-01-10 08:16:08

Redis集成JMS

2010-07-05 12:09:16

SQL Server

2022-06-27 13:56:10

設計模式緩存分布式系統

2022-12-02 07:28:58

Event訂閱模式Spring

2023-11-10 09:22:06

2025-01-09 11:15:47

2019-07-16 09:20:11

Redis數據庫NoSQL

2023-01-11 08:22:22

RabbitMQ通信模型

2015-01-27 10:25:42

消息系統Kafka

2023-07-10 09:18:39

Redis訂閱模型

2009-01-13 09:32:00

2019-06-05 16:02:49

5GVR虛擬現實

2025-04-10 01:01:00

2025-02-25 09:29:34

點贊
收藏

51CTO技術棧公眾號

特黄aaaaaaaaa毛片免费视频| 成人免费在线| 亚洲欧洲综合| 久久精品中文字幕免费mv| 成人性生交大片免费看视频r| 美女高潮久久久| 91啪国产在线| 国产精品18| 精品国产乱子伦一区| 亚洲成人套图| 欧美激情一区二区三区在线| 一区二区三区四区国产| 欧美成人高清| 国产99在线|中文| 97精品资源在线观看| 欧美一区二区高清| 天堂影院在线| 亚洲精选一二三| 美女福利视频在线| 国产一区福利在线| 日韩尤物视频| 99成人精品| 成人欧美一区二区三区黑人孕妇 | 亚洲综合色婷婷在线观看| 欧美一区二区三区四区高清| 免费观看又污又黄在线观看国产| 国产欧美日韩亚州综合 | av不卡在线| 日韩一区二区三区电影| 国产资源在线观看| 一区二区免费视频| 在线黄色免费观看| 中文字幕免费不卡在线| 成人在线免费播放视频| 91麻豆精品在线观看| 浮妇高潮喷白浆视频| 成人精品小蝌蚪| 欧美这里只有精品| 国产成人免费视频网站 | 成人免费直播live| 国产精品探花在线观看| 欧美亚洲第一区| 国产精品对白久久久久粗| 欧美成人免费全部| 深夜福利一区| 国语自产精品视频在免费| 中文字幕视频精品一区二区三区| 久久在线观看视频| 祥仔av免费一区二区三区四区| 中文字幕日韩免费视频| 精品国产亚洲一区二区三区| 欧美激情第6页| 丝袜连裤袜欧美激情日韩| 热99在线视频| 日韩一区电影| 国产精品入口免费| 天堂在线亚洲视频| 奇米777四色影视在线看| 91免费版在线| 97国产在线| 欧美日韩国产一级二级| 国产在线看片免费视频在线观看| 亚洲色图日韩av| 97视频一区| 国产日产久久高清欧美一区| 欧美高清一区| 中文网丁香综合网| 久久精品在线观看| 亚洲成人男人天堂| 亚洲成人av片在线观看| 久久精品资源| 国产精品高潮呻吟久久av黑人| 中文字幕一区二区三区欧美日韩 | 激情se五月| 国产精品久久久久久久浪潮网站 | 在线精品观看| 性欧美大战久久久久久久免费观看| 久久国产乱子精品免费女| 青青草综合在线| 国产欧美日韩在线| 欧美91精品久久久久国产性生爱| 欧美tickling网站挠脚心| 亚洲一区二区小说| 成人网在线视频| 久久精品久久精品| 先锋影音资源999| 欧美日韩一区成人| 亚洲午夜国产成人| 亚洲xxx视频| 懂色av一区二区夜夜嗨| 成视频在线免费观看| 香蕉视频成人在线观看| 亚洲女人天堂成人av在线| 成人动漫视频在线观看| 国产精品狼人色视频一区| 亚洲免费网站| 天天插天天操天天射| 欧美探花视频资源| 亚洲免费看片| 亚洲综合中文字幕在线| 国产精品66部| 欧美另类极限扩张| 亚洲欧美在线一区二区| 成人综合久久| 欧美美女黄色网| 精品久久久久久久久国产字幕| 欧美7777| 91在线免费网站| 99久久久久久| 免费的黄网站在线观看| 欧美激情一区二区久久久| 国产日韩高清一区二区三区在线| 丰满人妻中伦妇伦精品app | 国产免费一区二区三区在线能观看| 久久久夜夜夜| 狠狠干在线视频| 最近2019免费中文字幕视频三| 欧美日本一区二区高清播放视频| 成人毛片一区二区| 午夜激情久久久| 国产一区二区| 无遮挡亚洲一区| 懂色av影视一区二区三区| 精品视频在线播放一区二区三区| 欧美成熟毛茸茸复古| 亚洲男同性视频| 欧美日韩五区| 午夜精品亚洲一区二区三区嫩草| 午夜不卡av免费| 中文字幕综合网| 国产免费视频在线| 国语自产在线不卡| 丰满少妇久久久久久久| 九色porny在线| 国产有码在线一区二区视频| 国产亚洲精品福利| xxxxxx欧美| 欧美三级电影在线播放| 天天影视涩香欲综合网| 精品久久97| 亚洲欧洲日产国码无码久久99| 亚洲第一免费播放区| 在线成人www免费观看视频| 久久综合国产| 激情校园亚洲图片| 久热精品视频在线观看一区| 精品一区二区av| 污污片在线免费视频| 动漫3d精品一区二区三区| 亚洲国产日产av| 欧美成人一区在线观看| 久久久久久久久久久久91| 黄色欧美网站| 欧美一级二级三级| 色哟哟精品一区| 少妇精品久久久一区二区| 成人性生生活性生交12| 精品一区二区三区在线观看视频| 国内精品久久久| 95精品视频在线| 日本免费成人| 欧美爱爱视频免费看| 日韩中文字幕精品| 粉嫩在线一区二区三区视频| 美脚恋feet久草欧美| 草草草视频在线观看| 一区二区三区国产在线观看| 国产不卡一区视频| 日韩精品一级毛片在线播放| 欧美日韩在线一| 欧美激情一区二区三级高清视频| 国产视频一区在线观看| 国产一区二区三区免费观看在线| 欧美在线观看视频网站| 国外成人在线直播| 一区二区久久久久| 亚洲精品网址| 欧美成年黄网站色视频| 日本一区二区三区在线视频| 日韩电影在线观看中文字幕 | 国产精品国产亚洲精品看不卡15| 黑人精品xxx一区| 欧美日韩精品| av免费网站在线观看| 男女爱爱视频网站| 久久福利视频网| 一个色妞综合视频在线观看| 欧美三级网页| 国产精选在线| 国产精品无码av在线播放| 欧美一级bbbbb性bbbb喷潮片| 亚洲精品高清在线| 欧美日韩视频一区二区三区| 国产美女一区视频| 情侣黄网站免费看| 国产一区二中文字幕在线看| 欧美精品一区二区在线观看| 久久综合九色综合欧美98 | 日韩免费视频一区| 成人国产精品免费观看视频|