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

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

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

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

Redis發(fā)布訂閱(pub/sub)是一種消息通信模式:發(fā)送者(pub)發(fā)送消息,訂閱者(sub)接收信息??梢詤⒖枷旅鎯蓮垐D進(jìn)行理解。

二、幾個(gè)核心概念解釋

1.頻道

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

2、消息發(fā)布者

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

3、消息接收者

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

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

三、適用場(chǎng)景

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

2、事件訂閱,比如訂閱UP主,博主相關(guān)的消息等;

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

四、與springboot的整合

1、導(dǎo)入基礎(chǔ)依賴(lài)

        <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)聽(tīng)器,注意,container的參數(shù)列表是可以傳多個(gè)監(jiān)聽(tīng)器的,但是要定義監(jiān)聽(tīng)器的bean。在定義監(jiān)聽(tīng)器的方法體內(nèi)綁定消息處理器和管道(channel),一個(gè)監(jiān)聽(tīng)器可以監(jiān)聽(tīng)多個(gè)管道,可以通過(guò)數(shù)組或者添加多個(gè)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  這個(gè)container 可以添加多個(gè) messageListener
        container.addMessageListener(listener, new ChannelTopic("redis.user"));
        //container.addMessageListener(listener, new ChannelTopic("redis.news"));
        return container;
    }
}

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

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

這種寫(xiě)法和很多消息中間件對(duì)應(yīng)的API很相似,即通過(guò)一個(gè)監(jiān)聽(tīng)的代碼塊來(lái)完成監(jiān)聽(tīng)到消息后具體的業(yè)務(wù)操作;

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)聽(tīng)的頻道
        byte[] channelByte = message.getChannel();
        // 使用字符串序列化器轉(zhuǎn)換
        Object channel = redisTemplate.getStringSerializer().deserialize(channelByte);
        // 渠道名稱(chēng)轉(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來(lái)序列化和反序列化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來(lái)序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }

6、功能測(cè)試

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

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

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

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

通過(guò)斷點(diǎn)可以觀察發(fā)現(xiàn),通道中的消息被監(jiān)聽(tīng)器邏輯監(jiān)聽(tīng)到了,接下來(lái)就可以愉快的處理自己的業(yè)務(wù)了;

本篇通過(guò)案例演示了如何基于springboot整合使用redis的發(fā)布訂閱功能,更多的細(xì)節(jié)需要結(jié)合實(shí)際的開(kāi)發(fā)場(chǎng)景進(jìn)行完善

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

相關(guān)文章

  • MyBatis Plus 入門(mén)使用詳細(xì)教程

    MyBatis Plus 入門(mén)使用詳細(xì)教程

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

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

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

    Spring?Boot集成etcd的詳細(xì)過(guò)程

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

    Java 基礎(chǔ)--Arrays工具類(lèi)詳解

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

    mybatis解決<foreach>標(biāo)簽不能超過(guò)1000的問(wèn)題

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

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

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

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

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

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

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

    關(guān)于解決雪花算法生成的ID傳輸前端后精度丟失問(wèn)題

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

    Java阻塞隊(duì)列BlockingQueue基礎(chǔ)與使用

    本文詳細(xì)介紹了BlockingQueue家庭中的所有成員,包括他們各自的功能以及常見(jiàn)使用場(chǎng)景,通過(guò)實(shí)例代碼介紹了Java 阻塞隊(duì)列BlockingQueue的相關(guān)知識(shí),需要的朋友可以參考下
    2023-01-01

最新評(píng)論

延吉市| 锡林郭勒盟| 锦州市| 手机| 汝州市| 屏南县| 金溪县| 蕉岭县| 新和县| 休宁县| 新余市| 东辽县| 罗城| 阿荣旗| 通渭县| 当雄县| 四会市| 文成县| 长岭县| 揭东县| 安图县| 昭觉县| 海林市| 天气| 鱼台县| 方正县| 昌都县| 苍南县| 沙湾县| 昆明市| 杨浦区| 马鞍山市| 南充市| 岫岩| 宜宾市| 高雄市| 神农架林区| 武川县| 修文县| 巴马| 新和县|