当前位置:首页 > 科技  > 软件

Redis发布订阅,右手就行!

来源: 责编: 时间:2024-01-10 09:35:17 304观看
导读哈喽,大家好,我是了不起。Redis平常作为缓存使用较多,但是也可以作为发布订阅的消息队列来使用,本篇给大家介绍一下如何简单使用!右手就能操作前言本篇我们会使用Spring Data Redis中集成的发布订阅功能来展示这个示例,先看

哈喽,大家好,我是了不起。TXm28资讯网——每日最新资讯28at.com

Redis平常作为缓存使用较多,但是也可以作为发布订阅的消息队列来使用,本篇给大家介绍一下如何简单使用!右手就能操作TXm28资讯网——每日最新资讯28at.com

前言

本篇我们会使用Spring Data Redis中集成的发布订阅功能来展示这个示例,TXm28资讯网——每日最新资讯28at.com

先看我们需要的依赖, 其实只需要引入spring-boot-starter-data-redis 就够了,另外再写一个接口来触发消息发布。TXm28资讯网——每日最新资讯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 集成类似。TXm28资讯网——每日最新资讯28at.com

Redis 消息传递大致可分为两个功能领域:TXm28资讯网——每日最新资讯28at.com

  • 消息的发布或制作
  • 消息的订阅或消费

其中主要的类都在这两个包下面,感兴趣的小伙伴可以去看看,原理就先不讲了,下期再安排吧。TXm28资讯网——每日最新资讯28at.com

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

发布消息

发布消息我们可以直接使用RedisTemplate的 convertAndSend , 这个方法有两个参数,分别是channel, 还有消息内容。TXm28资讯网——每日最新资讯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);    }

本次我们使用如下类来发布消息。作为示例就要简单粗暴。TXm28资讯网——每日最新资讯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);    }}

订阅消息

订阅消息需要实现MessageListener的接口 ,onMessage的方法是收到消息后的消费方法。TXm28资讯网——每日最新资讯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());    }}

消息监听容器和适配器

另外就是订阅方订阅发布者,SpringDataRedis这里使用了一个消息监听容器和适配器来处理。我们直接贴出代码:TXm28资讯网——每日最新资讯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");    }}

以上代码中有几个点:TXm28资讯网——每日最新资讯28at.com

  1. 创建适配器时,这里面我们使用了MessageListener的实现类,简单容易理解。
  2. 使用消息容器来订阅消息队列,其中addMessageListener中可以订阅多个队列,其中第二个参数可以传入队列名数组。而且可以添加多个订阅方。

RedisMessageListenerContainer 是处理消费者和发布者的关系的类 ,使用起来也比较简单。TXm28资讯网——每日最新资讯28at.com

测试

下面我们做一个小测试:TXm28资讯网——每日最新资讯28at.com

写一个接口来出发消息发布,使用多个订阅者TXm28资讯网——每日最新资讯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项目后我们发送消息测试:TXm28资讯网——每日最新资讯28at.com

图片图片TXm28资讯网——每日最新资讯28at.com

两个消费者都接到了消息:TXm28资讯网——每日最新资讯28at.com

图片图片TXm28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-59651-0.htmlRedis发布订阅,右手就行!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Spring Boot:玩转日期时间类型参数转换技巧

下一篇: 掌握ReflectionUtils:解锁Java反射的无限可能

标签:
  • 热门焦点
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • 十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 小米公益基金会捐赠2500万元驰援北京、河北暴雨救灾

    8月2日消息,今日小米科技创始人雷军在其微博上发布消息称,小米公益基金会宣布捐赠2500万元驰援北京、河北暴雨救灾。携手抗灾,京冀安康!以下为公告原文
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
Top