最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot整合redis實現(xiàn)發(fā)布訂閱功能介紹步驟

 更新時間:2022年09月05日 16:25:59   作者:逆風飛翔的小叔  
發(fā)布訂閱作為一種設計思想在很多開源組件中都有體現(xiàn),比如大家熟知的消息中間件等,可謂把發(fā)布訂閱這一思想體現(xiàn)的淋漓盡致了

一、redis發(fā)布訂閱簡介

Redis發(fā)布訂閱(pub/sub)是一種消息通信模式:發(fā)送者(pub)發(fā)送消息,訂閱者(sub)接收信息。可以參考下面兩張圖進行理解。

二、幾個核心概念解釋

1.頻道

頻道(channel)類似于一個快遞柜,快遞員往里面放快遞,收件人去里面取快遞。管道(channel)是由中間件(redis)提供的,一個redisServer中有多個channel。

2、消息發(fā)布者

可以理解為消息的生產(chǎn)者,消息發(fā)布者通過中間件(redis、mq等)向某個頻道(管道)發(fā)送消息。

3、消息接收者

也可以理解為消息消費者,消息接收者通過訂閱某個頻道(管道)來接收發(fā)布者發(fā)布的消息。

發(fā)布者無需關心是否有人接收消息,發(fā)布者只需要把消息發(fā)布到某個管道中即可;

三、適用場景

1、核心業(yè)務完成后,非核心業(yè)務需要記錄日志,發(fā)郵件,發(fā)短信之類的操作,一般來說,通過這種方式,核心業(yè)務與非核心業(yè)務起到了一個解耦的作用;

2、事件訂閱,比如訂閱UP主,博主相關的消息等;

3、監(jiān)聽事件,比如在分布式微服務場景下,當應用A的某個數(shù)據(jù)發(fā)生變化時,應用B需要同步更新自己的數(shù)據(jù)做自身業(yè)務操作,對于應用A來說并不關心哪個應用,就可以通過這種方式實現(xiàn);

四、與springboot的整合

1、導入基礎依賴

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

2、配置文件

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://IP:3306/school?autoReconnect=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
    username: root
    password: root
    druid:
      max-active: 100
      initial-size: 10
      max-wait: 60000
      min-idle: 5
  redis:
    host: localhost
    port:  6379
  cache:
    type: redis

3、自定義RedisSubConfig

往容器(RedisMessageListenerContainer)內(nèi)添加消息監(jiān)聽器,注意,container的參數(shù)列表是可以傳多個監(jiān)聽器的,但是要定義監(jiān)聽器的bean。在定義監(jiān)聽器的方法體內(nèi)綁定消息處理器和管道(channel),一個監(jiān)聽器可以監(jiān)聽多個管道,可以通過數(shù)組或者添加多個channel的方式定義;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
@Configuration
public class RedisSubConfig {
    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory factory, RedisMessageListener listener) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(factory);
        //訂閱頻道redis.news 和 redis.life  這個container 可以添加多個 messageListener
        container.addMessageListener(listener, new ChannelTopic("redis.user"));
        //container.addMessageListener(listener, new ChannelTopic("redis.news"));
        return container;
    }
}

4、自定義消息監(jiān)聽器

需要實現(xiàn)MessageListener 接口,重寫里面的onMessage方法,方法體內(nèi)需要創(chuàng)建一個MessageListenerAdapter(這是一種規(guī)范寫法,用于綁定消息處理器和監(jiān)聽器)。

這種寫法和很多消息中間件對應的API很相似,即通過一個監(jiān)聽的代碼塊來完成監(jiān)聽到消息后具體的業(yè)務操作;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@Component
public class RedisMessageListener implements MessageListener {
    @Autowired
    private RedisTemplate redisTemplate;
    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 獲取消息
        byte[] messageBody = message.getBody();
        // 使用值序列化器轉(zhuǎn)換
        Object msg = redisTemplate.getValueSerializer().deserialize(messageBody);
        // 獲取監(jiān)聽的頻道
        byte[] channelByte = message.getChannel();
        // 使用字符串序列化器轉(zhuǎn)換
        Object channel = redisTemplate.getStringSerializer().deserialize(channelByte);
        // 渠道名稱轉(zhuǎn)換
        String patternStr = new String(pattern);
        System.out.println(patternStr);
        System.out.println("---頻道---: " + channel);
        System.out.println("---消息內(nèi)容---: " + msg);
    }
}

5、redistemplate的序列化

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        //使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(mapper);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //使用StringRedisSerializer來序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }

6、功能測試

下面寫一個測試的接口,模擬業(yè)務處理完畢后,向 redis.user 這個通道發(fā)送一條消息,看看監(jiān)聽器中是否能夠正常接收到消息即可;

@RestController
public class RedisPubController {
    @Autowired
    private RedisTemplate redisTemplate;
    @GetMapping("/getUserById")
    public String getUserById(String userId){
        //TODO 執(zhí)行主業(yè)務
        redisTemplate.convertAndSend("redis.user", userId);
        return "hello:" + userId;
    }
}

啟動工程后調(diào)用接口:

http://localhost:8083/getByUserIdId?userId=1

通過斷點可以觀察發(fā)現(xiàn),通道中的消息被監(jiān)聽器邏輯監(jiān)聽到了,接下來就可以愉快的處理自己的業(yè)務了;

本篇通過案例演示了如何基于springboot整合使用redis的發(fā)布訂閱功能,更多的細節(jié)需要結合實際的開發(fā)場景進行完善

到此這篇關于Springboot整合redis實現(xiàn)發(fā)布訂閱功能介紹步驟的文章就介紹到這了,更多相關Springboot發(fā)布訂閱內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MyBatis Plus 入門使用詳細教程

    MyBatis Plus 入門使用詳細教程

    這篇文章主要介紹了MyBatis Plus 入門使用詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • java字節(jié)流、字符流與轉(zhuǎn)換流過程

    java字節(jié)流、字符流與轉(zhuǎn)換流過程

    輸入輸出流(IO流)是數(shù)據(jù)傳輸?shù)某橄蟾拍?用于表示數(shù)據(jù)在設備間的傳輸過程,IO流按數(shù)據(jù)類型分為字符流和字節(jié)流,按數(shù)據(jù)流向分為輸入流和輸出流,字節(jié)流操作單個字節(jié),字符流操作字符,在實際應用中,非文本文件多用字節(jié)流操作
    2024-10-10
  • Spring?Boot集成etcd的詳細過程

    Spring?Boot集成etcd的詳細過程

    etcd是一個分布式鍵值存儲數(shù)據(jù)庫,用于共享配置和服務發(fā)現(xiàn),etcd采用Go語言編寫,具有出色的跨平臺支持,很小的二進制文件和強大的社區(qū),這篇文章主要介紹了SpringBoot集成etcd,需要的朋友可以參考下
    2023-08-08
  • Java 基礎--Arrays工具類詳解

    Java 基礎--Arrays工具類詳解

    這篇文章主要介紹了Java Arrays工具類用法,結合實例形式分析了java Arrays工具類針對數(shù)組元素修改、復制、排序等操作使用技巧與相關注意事項,需要的朋友可以參考下
    2021-09-09
  • mybatis解決<foreach>標簽不能超過1000的問題

    mybatis解決<foreach>標簽不能超過1000的問題

    MyBatis是一個開源的持久層框架,它可以幫助開發(fā)者簡化數(shù)據(jù)庫操作的編寫,而foreach是MyBatis中的一個重要標簽,用于在SQL語句中進行循環(huán)操作,本文主要給大家介紹了mybatis解決<foreach>標簽不能超過1000的問題,需要的朋友可以參考下
    2024-05-05
  • 如何在攔截器中獲取url路徑里面@PathVariable的參數(shù)值

    如何在攔截器中獲取url路徑里面@PathVariable的參數(shù)值

    這篇文章主要介紹了如何在攔截器中獲取url路徑里面@PathVariable的參數(shù)值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 詳解Java中int和Integer的區(qū)別

    詳解Java中int和Integer的區(qū)別

    這篇文章主要介紹了Java中int和Integer的區(qū)別文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Spring?Cloud?Gateway編碼實現(xiàn)任意地址跳轉(zhuǎn)

    Spring?Cloud?Gateway編碼實現(xiàn)任意地址跳轉(zhuǎn)

    這篇文章主要介紹了Spring?Cloud?Gateway編碼實現(xiàn)任意地址跳轉(zhuǎn)的相關資料,需要的朋友可以參考下
    2023-06-06
  • 關于解決雪花算法生成的ID傳輸前端后精度丟失問題

    關于解決雪花算法生成的ID傳輸前端后精度丟失問題

    這篇文章主要介紹了關于解決雪花算法生成的ID傳輸前端后精度丟失問題,雪花算法生成的ID傳輸?shù)角岸藭r,會出現(xiàn)后三位精度丟失,本文提供了解決思路,需要的朋友可以參考下
    2023-03-03
  • Java阻塞隊列BlockingQueue基礎與使用

    Java阻塞隊列BlockingQueue基礎與使用

    本文詳細介紹了BlockingQueue家庭中的所有成員,包括他們各自的功能以及常見使用場景,通過實例代碼介紹了Java 阻塞隊列BlockingQueue的相關知識,需要的朋友可以參考下
    2023-01-01

最新評論

蒙山县| 光泽县| 礼泉县| 云龙县| 玉树县| 波密县| 车险| 深泽县| 崇明县| 太康县| 嘉祥县| 阿勒泰市| 海安县| 汾阳市| 闻喜县| 铁岭县| 宁晋县| 同德县| 那坡县| 衡阳市| 大渡口区| 临武县| 县级市| 彝良县| 莱西市| 玉树县| 栾川县| 中西区| 郧西县| 姜堰市| 礼泉县| 梨树县| 平武县| 方城县| 闽清县| 永昌县| 瓦房店市| 昂仁县| 牡丹江市| 新和县| 安化县|