AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

Redis發(fā)布訂閱,右手就行!

來源: 責編: 時間:2024-01-10 09:35:17 225觀看
導(dǎo)讀哈嘍,大家好,我是了不起。Redis平常作為緩存使用較多,但是也可以作為發(fā)布訂閱的消息隊列來使用,本篇給大家介紹一下如何簡單使用!右手就能操作前言本篇我們會使用Spring Data Redis中集成的發(fā)布訂閱功能來展示這個示例,先看

哈嘍,大家好,我是了不起。eeM28資訊網(wǎng)——每日最新資訊28at.com

Redis平常作為緩存使用較多,但是也可以作為發(fā)布訂閱的消息隊列來使用,本篇給大家介紹一下如何簡單使用!右手就能操作eeM28資訊網(wǎng)——每日最新資訊28at.com

前言

本篇我們會使用Spring Data Redis中集成的發(fā)布訂閱功能來展示這個示例,eeM28資訊網(wǎng)——每日最新資訊28at.com

先看我們需要的依賴, 其實只需要引入spring-boot-starter-data-redis 就夠了,另外再寫一個接口來觸發(fā)消息發(fā)布。eeM28資訊網(wǎng)——每日最新資訊28at.com

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

Spring Data 為 Redis 提供了專用的消息傳遞集成,其功能和命名與 Spring Framework 中的 JMS 集成類似。eeM28資訊網(wǎng)——每日最新資訊28at.com

Redis 消息傳遞大致可分為兩個功能領(lǐng)域:eeM28資訊網(wǎng)——每日最新資訊28at.com

  • 消息的發(fā)布或制作
  • 消息的訂閱或消費

其中主要的類都在這兩個包下面,感興趣的小伙伴可以去看看,原理就先不講了,下期再安排吧。eeM28資訊網(wǎng)——每日最新資訊28at.com

org.springframework.data.redis.connectionorg.springframework.data.redis.listener

發(fā)布消息

發(fā)布消息我們可以直接使用RedisTemplate的 convertAndSend , 這個方法有兩個參數(shù),分別是channel, 還有消息內(nèi)容。eeM28資訊網(wǎng)——每日最新資訊28at.com

public Long convertAndSend(String channel, Object message) {        Assert.hasText(channel, "a non-empty channel is required");        byte[] rawChannel = this.rawString(channel);        byte[] rawMessage = this.rawValue(message);        return (Long)this.execute((connection) -> {            return connection.publish(rawChannel, rawMessage);        }, true);    }

本次我們使用如下類來發(fā)布消息。作為示例就要簡單粗暴。eeM28資訊網(wǎng)——每日最新資訊28at.com

public interface MessagePublisher {    void publish(String message);}import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.listener.ChannelTopic;public class RedisMessagePublisher implements MessagePublisher {    private RedisTemplate<String, Object> redisTemplate;    private ChannelTopic topic;    public RedisMessagePublisher() {    }    public RedisMessagePublisher(            RedisTemplate<String, Object> redisTemplate, ChannelTopic topic) {        this.redisTemplate = redisTemplate;        this.topic = topic;    }    public void publish(String message) {        redisTemplate.convertAndSend(topic.getTopic(), message);    }}

訂閱消息

訂閱消息需要實現(xiàn)MessageListener的接口 ,onMessage的方法是收到消息后的消費方法。eeM28資訊網(wǎng)——每日最新資訊28at.com

import org.springframework.data.redis.connection.Message;import org.springframework.data.redis.connection.MessageListener;import org.springframework.stereotype.Service;@Servicepublic class RedisMessageSubscriber implements MessageListener {        public void onMessage(Message message, byte[] pattern) {        System.*out*.println("Message received: " + message.toString());    }}// 消息訂閱2@Service("redisMessageSubscriber2")public class RedisMessageSubscriber2 implements MessageListener {    public void onMessage(Message message, byte[] pattern) {        System.out.println("Message received2: " + message.toString());    }}

消息監(jiān)聽容器和適配器

另外就是訂閱方訂閱發(fā)布者,SpringDataRedis這里使用了一個消息監(jiān)聽容器和適配器來處理。我們直接貼出代碼:eeM28資訊網(wǎng)——每日最新資訊28at.com

import com.north.redis.message.MessagePublisher;import com.north.redis.message.RedisMessagePublisher;import com.north.redis.message.RedisMessageSubscriber;import jakarta.annotation.Resource;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.MessageListener;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.listener.ChannelTopic;import org.springframework.data.redis.listener.RedisMessageListenerContainer;import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;@Configurationpublic class RedisConfig {    @Autowired    private RedisConnectionFactory redisConnectionFactory;    @Resource    MessageListener redisMessageSubscriber2;        @Bean    public RedisTemplate<String, Object> redisTemplate() {        RedisTemplate<String, Object> template = new RedisTemplate<>();        template.setConnectionFactory(redisConnectionFactory);        // 使用StringRedisSerializer來序列化和反序列化redis的key值        template.setKeySerializer(new StringRedisSerializer());        // 使用GenericJackson2JsonRedisSerializer來序列化和反序列化redis的value值        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());        template.afterPropertiesSet();        return template;    }    @Bean    MessageListenerAdapter messageListener() {        return new MessageListenerAdapter(new RedisMessageSubscriber());    }        @Bean    RedisMessageListenerContainer redisContainer() {        RedisMessageListenerContainer container                = new RedisMessageListenerContainer();        container.setConnectionFactory(redisConnectionFactory);        container.addMessageListener(messageListener(), topic());        container.addMessageListener(redisMessageSubscriber2, topic());        return container;    }    @Bean    MessagePublisher redisPublisher() {        return new RedisMessagePublisher(redisTemplate(), topic());    }    @Bean    ChannelTopic topic() {        return new ChannelTopic("northQueue");    }}

以上代碼中有幾個點:eeM28資訊網(wǎng)——每日最新資訊28at.com

  1. 創(chuàng)建適配器時,這里面我們使用了MessageListener的實現(xiàn)類,簡單容易理解。
  2. 使用消息容器來訂閱消息隊列,其中addMessageListener中可以訂閱多個隊列,其中第二個參數(shù)可以傳入隊列名數(shù)組。而且可以添加多個訂閱方。

RedisMessageListenerContainer 是處理消費者和發(fā)布者的關(guān)系的類 ,使用起來也比較簡單。eeM28資訊網(wǎng)——每日最新資訊28at.com

測試

下面我們做一個小測試:eeM28資訊網(wǎng)——每日最新資訊28at.com

寫一個接口來出發(fā)消息發(fā)布,使用多個訂閱者eeM28資訊網(wǎng)——每日最新資訊28at.com

@RestControllerpublic class TestController {    @Resource    private MessagePublisher redisMessagePublisher;    @GetMapping("/hello")    public Flux<String> hello(@RequestParam String message) {        redisMessagePublisher.publish(message);        return Flux.*just*("Hello", "Webflux");    }}

啟動SpringBoot項目后我們發(fā)送消息測試:eeM28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片eeM28資訊網(wǎng)——每日最新資訊28at.com

兩個消費者都接到了消息:eeM28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片eeM28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-59651-0.htmlRedis發(fā)布訂閱,右手就行!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Spring Boot:玩轉(zhuǎn)日期時間類型參數(shù)轉(zhuǎn)換技巧

下一篇: 掌握ReflectionUtils:解鎖Java反射的無限可能

標簽:
  • 熱門焦點
  • 5月安卓手機好評榜:魅族20 Pro奪冠

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數(shù)據(jù)來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內(nèi)市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設(shè)備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發(fā)生
  • 從零到英雄:高并發(fā)與性能優(yōu)化的神奇之旅

    作者 | 波哥審校 | 重樓作為公司的架構(gòu)師或者程序員,你是否曾經(jīng)為公司的系統(tǒng)在面對高并發(fā)和性能瓶頸時感到手足無措或者焦頭爛額呢?筆者在出道那會為此是吃盡了苦頭的,不過也得
  • 騰訊VS網(wǎng)易,最卷游戲暑期檔,誰能笑到最后?

    作者:無銹缽來源:財經(jīng)無忌7月16日晚,上海1862時尚藝術(shù)中心。伴隨著幻象的精準命中,碩大的熒幕之上,比分被定格在了14:12,被寄予厚望的EDG戰(zhàn)隊以絕對的優(yōu)勢戰(zhàn)勝了BLG戰(zhàn)隊,拿下了總決
  • 馮提莫簽約抖音公會 前“斗魚一姐”消失在直播間

    來源:直播觀察提起&ldquo;馮提莫&rdquo;這個名字,很多網(wǎng)友或許聽過,但應(yīng)該不記得她是哪位主播了。其實,作為曾經(jīng)的&ldquo;斗魚一姐&rdquo;,馮提莫在游戲直播的年代影響力不輸于現(xiàn)
  • 重估百度丨大模型,能撐起百度的“今天”嗎?

    自象限原創(chuàng) 作者|程心 羅輯2023年之前,對于自己的&ldquo;今天&rdquo;,百度也很迷茫。&ldquo;新業(yè)務(wù)到 2022 年底還是 0,希望 2023 年出來一個 1。&rdquo;這是2022年底,李彥宏
  • 國行版三星Galaxy Z Fold5/Z Flip5發(fā)布 售價7499元起

    2023年8月3日,三星電子舉行Galaxy新品中國發(fā)布會,正式在國內(nèi)推出了新一代折疊屏智能手機三星Galaxy Z Fold5與Galaxy Z Flip5,以及三星Galaxy Tab S9
  • iQOO Neo8 Pro即將開售:到手價3099元起 安卓性能最強旗艦

    5月23日,iQOO如期舉行了新品發(fā)布會,全新的iQOO Neo8系列也正式與大家見面,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更
  • 親歷馬斯克血洗Twitter,硅谷的苦日子在后頭

    文/劉哲銘  編輯/李薇  馬斯克再次揮下裁員大刀。  美國時間11月14日,Twitter約4400名外包員工遭解雇,此次被解雇的員工的主要工作為內(nèi)容審核等。此前,T
Top