SpringBoot Redis 实现消息发布与订阅

基于Springboot 实现Redis消息发布与订阅 最新项目中用到了这个,研究了一番没看懂,于是在github上找了个小案例自己动手写了一下,终于摸清楚了流程! 有时候项目中把redis中缓存的数据更新后,消费此消息的对象并不知道已经更新了该缓存数据,导致无法实时操作最新的缓存数据,redis的消息发布于订阅则可以解决这个问题。 首先消息发布与订阅是基于队列的方式实现的,对于简便的功能,使用redis提供的此功能则完美解决,而对于数据量大且复杂... 阅读详情

1、POM 引入

<parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.2.4.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
</parent>

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

2、Redis配置

spring:
  redis:
    host: ${ip.redis}
    port: 6379
    database: 0

3、RedisTemplate配置,Redis消息事件注册

package com.cict.iwu.project.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.util.*;

@Configuration
public class RedisTemplateConfig implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        // 使用Jackson2JsonRedisSerialize 替换默认序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        // 设置redis连接
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 设置value的序列化规则和 key的序列化规则
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // 将redisTemplate的序列化方式更改为StringRedisSerializer
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }



    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(applicationContext.getBean(LoggerEventListener.class),new ChannelTopic(Constants.CHANNEL_LOGGER));
        return container;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        RedisTemplateConfig.applicationContext = applicationContext;
    }
}

4、Redis消息发布

    @Override
    public void addAuditLog(AuditLog auditLog) {
        if (auditLog != null) {
            IWULog iwulog = (IWULog) auditLog;
            iwulog.setLogContent(logContentDecrypt(iwulog));
            redisUtils.publish(Constants.CHANNEL_LOGGER, iwulog.toString());
            log.debug("============================================="+JSONObject.toJSONString(iwulog));
        }
    }

5、Redis消息消费

package com.cict.iwu.project.config;


import com.cict.iwu.project.uitl.EnvUtils;
import com.cict.iwu.project.uitl.FileWriteUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.DependsOn;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

@Slf4j
@Component
@DependsOn("envUtils")
public class LoggerEventListener extends MessageListenerAdapter {


    public LoggerEventListener() {
        super();
        // first:检查日志文件目录是否存在,不存在则创建
        checkParentFolder();
        //second:加载并检查日志文件是否存在,不存在则创建
        load();
    }

    @Override
    public void onMessage(Message message, @Nullable byte[] pattern) {
        logger.debug("***************************************************{}" + new String(message.getBody()));
        //日志文件每天动态生成。
        load();
        FileWriteUtils.writeNewLineAppend(writer, new String(message.getBody()), true);
    }

    /**
     * 检查日志文件是否存在,不存在则创建日志文件;检查日志文件writer是否创建,没有则创建日志文件Writer
     */
    private void load() {
    
    }


}

 

【Spring Boot 3】【Redis】集成Redisson实现消息发布订阅 Redisson区别与Lettuce和Jedis之处在于,Redisson不再是一个纯粹的Redis客户端,还提供了很多高级的分布式服务,本文介绍开发Spring Boot应用集成Redisson实现消息的发布及订阅。:定义消息主题(Topic)及消息对象类。:定时发布消息。:订阅消息。 阅读详情

相关推荐

5-->详解《switch 数据接收驱动框架、mtk7621集成交换芯片mt7530》之一

SWITCH 交换芯片驱动配置: 一、 配置 MDIO 总线 二、配置 MAC 接口 三、基于 MAC 的 DMA 配置 四、设备驱动结构体 五、数据收发包

weixin_38387929的博客 1万+

Redis 消息发布订阅 与 Spring boot 使用快速入门

目录 Redis 发布订阅 命令 Redis 发布订阅 命令 命令 描述 Redis Unsubscribe 命令 指退订给定的频道。UNSUBSCRIBE channel [channel ...] Redis Subscribe 命令 订阅给定的一个或多个频道的信息。SUBSCRIBE channel [channel ...] Redis Pubsub 命令 查看订阅与发布系统状态。PUBSUB <subcommand> [argument [ar

蚩尤后裔-汪茂雄 4484

Linux -- 图形界面配置Samba;system-config-samba工具

图形界面配置Samba6.6.1 system-config-sambasystem-config-samba是Red Hat公司专门为Samba服务器管理编写的图形界面的管理工具,通过system-config-samba几乎可以完成对Samba服务器的所有配置,所以在只希望通过Samba服务器实现一些简单的资源共享时,system-config-samba是一个不错的选...

weixin_33695450的博客 2200

Spring boot整合Redis实现发布订阅(超详细)

Redis发布订阅基础知识相关命令订阅者/等待接收消息发布者/发送消息订阅者/成功接收消息常用命令汇总原理Spring boot整合redis导入依赖Redis配置消息封装类(MessageDto)Redis配置类测试类订阅方实现一:RedisMessageListener订阅方实现二:PrintMessageReceiverMessageListenerAdapter源码分析 基础知识 Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收信息。微信,微博

BBX__XB的博客 1万+

自制温湿度计——STM32-L432KC驱动lcd1602和dht11温湿度显示

先给大家甩一张图片哈(附上网址)简单说一下这块板子在这个小项目里的小缺点:一、引脚有点少,lcd1602本来有两种传输数据方式,一种是4bit,另一种是8bit,但是这块板子对于这个项目来说引脚有点少,所以建议用4bit模式。然而,在网上是很难找到设置4bit传输模式的lcd1602的,这也是为什么我写这个blog。二、mbed-os有时候会有大大小小的问题,搞人心态是真的。比如库函数离奇失踪,从官网上下载库函数失败,重装也解决不了然后莫名其妙好了。

m0_72994251的博客 3912

vLLM 多机多卡推理测试与验证(Kubernetes)vLLM 多机多卡推理 Kubernetes 验证

本文记录在两台 L20 机器,每台机器 4 块 L20 显卡(46G)的环境下,使用 vLLM 部署 Qwen2.5-32B-Instruct-GPTQ-Int4 模型并提供多节点多卡推理服务的过程。服务(Serving)模型服务是指将模型部署到生产环境中,通过 API 或其他接口提供预测服务的过程。【分布式推理与服务】(Distributed Inference and Serving)是指在多个机器或设备之间部署和管理机器学习模型,以高效地处理推理请求并满足大规模服务需求。3、启动 vLLM 服务。

流水_鱼鱼的博客 3459

Spring Boot 整合Redis实现消息发布与订阅

方式一:编写Redis监听类RedisMessageListener,实现Redis的监听接口MessageListener,并重写onMessage方法 方式二:编写Redis消息监听适配器类,并在RedisConfig.java中配置消息监听适配器bean

TechnicianWang的博客 3478

心理学量表汇总 50多个 附下载

目录一、心理健康与精神病态量表二、行为问题量表三、人格评估量表四、智力测验一、心理健康与精神病态量表1.一般症状自评量表(SCL-90)症状自评量表 (The self-report symptom inventory ,Symptom checklist ,90,简称 SCL90) 有 90 个评定项目 , 每个项目分五级评分 , 包含了比较广泛的精神病症状学内容, 从感觉、 情 感、思维、意识、行为直至生活习惯、人际关系、饮食等均有涉及,能准确刻划被试的自觉 症状,能较好地反映被试的问题及其严重程度和变

南七小僧的学海无涯 1904

JAVA 实现 Redis 发布订阅

和,两者之间通过某种媒介联系起来例如订杂志,当自己订阅了爱格杂志,每个月会发刊一本。到发布的时候派送员将杂志送到自己手上就能看到杂志内容。只有我们订阅了该杂志才会派送给我们Redis 发布订阅(pub/sub)是一种 消息通信模式 :发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。

蔡定努 5073

STM32F103/F407/H743不同GPIO速度配置(HAL库)对应的最高速度

详细介绍了STM32F103/F407/H743不同GPIO速度配置(HAL库)对应的最高速度。

kevin1499的博客 5588

大数据领域数据服务的数据分析工具推荐

你有没有过这样的经历?——领导说“帮我分析一下上个月的销量”,你打开Excel却发现数据有100万行,电脑直接卡死;或者想实时知道“现在直播间的观众在买什么”,却不知道用什么工具处理每秒10万条的点击数据。本文的目的:帮你解决“选什么工具做什么事”的问题,覆盖大数据服务的全流程(采集→存储→处理→分析→可视化),推荐高频、实用、易上手的工具,并讲清楚它们的“适用场景”和“优缺点”。范围。

大数据洞察的博客 1931

基于java实现redis实现发布与订阅

一、发布和订阅介绍官网介绍:Redis 发布/订阅是一种消息传模式,其中发送者(在Redis术语中称为发布者)发送消息,而接收者(订阅者)接收消息。传递消息的通道称为。redis的发布与订阅缺点:发布订阅的消息不会被持久化,所以新订阅客户端不会接收到历史消息。

qq_43394776的博客 3147

Bootstrap方法详解——技术与实例

一、Introduction 如果说到Bootstrap你会想到什么?是Twitter推出的那个用于前端开发的开源工具包吗?Unfortunately,本文要讨论的并非是Bootstrap工具包,而是统计学习中一种重采样(Resampling)技术。这种看似简单的方法,对后来的很多技术都产生了深远的影响。机器学习中的Bagging,AdaBoost等方法其实都蕴含了Bootstrap的思想...

白马负金羁 8万+

Springboot整合Redis实现消息发布订阅

有时候在实际项目中,某些业务场景下我们需要使用消息的发布订阅功能,以实现某些特殊的需求,那么我们实际上可以有多种选择,比如使用常见的消息中间件Rabbitmq,Kafka,Activemq等,但这几个都算是重量级的消息队列,使用成本相比较于Redis要高,而在有些业务中,我们可能只是想实现消息的发布订阅,并不是需要保证消息的完全的可靠性没有很高的要求,那么使用Redis无疑是最好的选择。3.实现自定义的Redis 消息订阅-消息监听器,处理收到的订阅消息。6.我们也可以在Controller测试下。

qq_42077317的博客 1531

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

spring-boot集成redis实现消息发布订阅模式,以及多个订阅模式的实现

spring-boot集成redis实现消息发布订阅模式,以及多个订阅模式的实现1.需要的依赖2.配置redis以及连接池3.创建消息的发布者和消息处理者类消息发布者消息处理器POJO4.设置消息发布者、消息处理者POJO、redis消息监听容器以及redis监听器注入IOC容器5.启动项目查看控制台参照学习的博客作者和地址6.如何配置多个监听通道方式1:一个监听器订阅多个通道方式2:配置多个监听...

今晚摸鱼 8761

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

使用 SpringBoot + Redis 进行自定义注解,实现消息发布订阅

在分布式系统中,消息的发布订阅模式(Publish/Subscribe)是一种常用的消息通信方式。通过消息发布订阅,可以实现模块间的解耦,提高系统的扩展性和可维护性。本文将介绍如何使用 SpringBoot 和 Redis,通过自定义注解来实现一个简单的消息发布订阅功能。项目结构登录后复制 ├── src │ ├──...

cnzzs的博客 1069

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Spring Boot结合Redis实现消息发布与订阅

今天来学习如何利用Spring Data对Redis的支持来实现消息的发布订阅机制。发布订阅是一种典型的异步通信模型,可以让消息的发布者和订阅者充分解耦。在我们的例子中,我们将使用StringRedisTemplate来发布一个字符串消息,同时基于MessageListenerAdapter使用一个POJO来订阅和响应该消息。 提示 事实上,Redis不仅提供一个NoSQL数据库,同时提供了一套消息系统。 环境准备 开发环境: IDE+Java环境(JDK 1.7或以上版本) Maven 3.0+(Ecli

qq_43380361的博客 598

springboot整合redis实现消息发布和订阅

springboot整合redis实现消息发布和订阅 先了解一下redis消息发布订阅的机制: 发布者将消息发布在一个channel(可认为是频道)上,可以供多个订阅者订阅查看信息,所以说channel是连接发布者和订阅者之间的桥梁。 1.实现一个用于接听消息的实体类 @Component public class MessageReceiver implements MessageListener { @Autowired private RedisTemplate redisTemp

小小周的博客 671

java spring redis订阅_Spring boot+redis实现消息发布与订阅的代码

一.创建spring boot项目org.springframework.bootspring-boot-starter-data-redisorg.springframework.bootspring-boot-starter-webcom.alibabafastjson1.2.41二.编辑yml配置文件server:port: 7888# 日志配置logging:config: classpa...

weixin_30830161的博客 296

springboot入门--springboot集成redis实现消息发布订阅模式-单通道

一.配置文件spring: redis: host: 192.168.0.200 port: 6379 password: database: 1 pool.max-active: 8 pool.max-wait: -1 pool.max-idle: 8 pool.min-idle: 0 timeout:...

llll234的博客 1008

SpringBoot整合Redis实现消息发布订阅

前言: SpringBoot整合Redis此处不作赘述 为减少篇幅,只有部分代码(不影响使用) 本文基于lombok插件以及logback日志,所以如果某些注解报错或者无法导入基本是这两处的问题 勿喷 正文 Redis常量配置(个人习惯,本类按需求而定) public class RedisConstant { /** * 消息订阅点赞主题 */ pub...

single_cong的博客 7920

nodejs redis 发布订阅_太赞了:Spring boot+redis实现消息发布与订阅

一.创建spring boot项目 org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-starter-web ...

weixin_39667080的博客 83

springboot整合redis实现消息发布订阅

springboot整合redis实现消息发布和订阅 先了解一下redis消息发布订阅的机制: 发布者将消息发布在一个channel(可认为是频道)上,可以供多个订阅者订阅查看信息,所以说channel是连接发布者和订阅者之间的桥梁。 1.实现一个用于接听消息的实体类 @Component public class MessageReceiver implements MessageListene...

duo-ing的博客 693

springboot入门--springboot集成redis实现消息发布订阅模式-双通道

一.配置文件spring: redis: host: 192.168.0.200 port: 6379 password: database: 1 pool.max-active: 8 pool.max-wait: -1 pool.max-idle: 8 pool.min-idle: 0 timeout:...

llll234的博客 8462
上一篇: Java 读取文件到byte数组的三种方式
下一篇: Shell 脚本学习笔记
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仰望星空@脚踏实地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值