SpringBoot监控Redis事件通知

news2024/11/25 0:39:46

Redis的事件通知

Redis事件通过 Redis 的订阅与发布功能(pub/sub)来进行分发, 因此所有支持订阅与发布功能的客户端都可以在无须做任何修改的情况下, 使用键空间通知功能。

因为 Redis 目前的订阅与发布功能采取的是发送即忘(fire and forget)策略, 当订阅事件的客户端断线时, 它会丢失所有在断线期间分发给它的事件。

在Spring Boot中,可以通过实现RedisMessageListener接口来实现Redis键过期回调功能。

Redis事件配置

因为开启redis通知功能需要消耗一些 CPU , 所以在默认配置下, 该功能处于关闭状态。

可以通过修改 redis.conf 文件, 或者直接使用 CONFIG SET 命令来开启或关闭键空间通知功能:

当 notify-keyspace-events 选项的参数为空字符串时,功能关闭。
当参数不是空字符串时,功能开启。
notify-keyspace-events 的参数可以是以下字符的任意组合, 它指定了服务器该发送哪些类型的通知:

输入的参数中至少要有一个 K或者 E , 否则的话, 不管其余的参数是什么, 都不会有任何通知被分发。

举个例子, 如果只想订阅键空间中和列表相关的通知, 那么参数就应该设为 Kl , 诸如此类。

将参数设为字符串"AKE" 表示发送所有类型的通知。

SpringBoot实现

pom中引入依赖

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

yml中redis配置

spring:
  redis:
    host: 192.168.1.111
    port: 6379
    password: 123456
    timeout: 1000
    jedis:
      pool:
        max-active: 10
        max-wait: -1ms
        max-idle: 8
        min-idle: 0

RedisConfig

@Configuration
@EnableCaching
@AutoConfigureBefore(RedisAutoConfiguration.class)
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    @SuppressWarnings(value = {"unchecked", "rawtypes"})
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);

        FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);

        // 使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(serializer);

        // Hash的key也采用StringRedisSerializer的序列化方式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);

        template.afterPropertiesSet();
        return template;
    }

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer(
            RedisConnectionFactory connectionFactory,
            MessageListener messageListener) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);

        // 设置监听的频道,这里监听了"__keyevent@0__:expired"频道,其中0是Redis数据库的索引
        container.addMessageListener(messageListener, new PatternTopic("__keyevent@*__:expired"));
        container.addMessageListener(messageListener, new PatternTopic("__keyevent@*__:set"));
        container.addMessageListener(messageListener, new PatternTopic("__keyevent@*__:del"));

        return container;
    }
}

在上述配置中,通过PatternTopic指定监听的Redis键过期事件频道为__keyevent@*__:expired、__keyevent@*__:set、__keyevent@*__:del,并将RedisKeyListener注册到容器中。
分别对应过期、设置、删除事件:

    keyevent 是 Redis 中的一种特殊频道,用于发布键空间通知(keyspace notifications)事件。

    @0 表示 Redis 数据库的索引。Redis 支持多个数据库,索引从 0 开始,因此 0 表示默认的第一个数据库。

    :expired 是事件类型,表示键已过期。

    :set是事件类型,表示新增键。

    :del是事件类型,表示删除键。

 

FastJson2JsonRedisSerializer

public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T> {

    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

    private Class<T> clazz;

    public FastJson2JsonRedisSerializer(Class<T> clazz) {
        super();
        this.clazz = clazz;
    }

    @Override
    public byte[] serialize(T t) throws SerializationException {
        if (t == null) {
            return new byte[0];
        }
        return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET);
    }

    @Override
    public T deserialize(byte[] bytes) throws SerializationException {
        if (bytes == null || bytes.length <= 0) {
            return null;
        }
        String str = new String(bytes, DEFAULT_CHARSET);

        return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType);
    }
}

RedisKeyListener事件监听器,实现MessageListener接口,并实现onMessage方法,该方法会在事件发生时被调用

@Component
public class RedisKeyListener implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] pattern) {
        String expiredKey = message.toString();
        String str = new String(pattern);
        // 在这里添加业务逻辑,比如清除相关数据或发送通知
        System.out.println("键:"+str +"--" + expiredKey);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1260582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL进阶-锁

✨作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、语雀 、Github &#x1f389;公众号&#xff1a;猫十二懿 一、MySQL 锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、…

Excel如何比较两列数据的不同

当遇到exel有两个列表的数据&#xff0c;需要比较得到他们的不同的部分&#xff0c;并且得到一个不同的值的列表。示例如下&#xff1a; 目的是&#xff1a;通过比较&#xff0c;知道Column2的哪些值不在在Column1里。 WPS直接提供了这一个功能&#xff0c;如下图&#xff1a;…

基于Python获取亚马逊的评论信息的处理

文章目录 一、分析亚马逊的评论请求二、获取亚马逊评论的内容三、亚马逊评论信息的处理四、代码整合4.1 代理设置4.2 while循环翻页 总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具…

理解Android无埋点技术

首先什么是无埋点呢&#xff0c;其实所谓无埋点就是开发者无需再对追踪点进行埋码&#xff0c;而是脱离代码&#xff0c;只需面对应用界面圈圈点点即可追加随时生效的事件数据点。 无埋点的好处 其实无埋点并不是完全不用写代码&#xff0c;而是尽可能的少写代码。开发者将SDK集…

策略算法与Actor-Critic网络

策略算法 教程链接 DataWhale强化学习课程JoyRL https://johnjim0816.com/joyrl-book/#/ch7/main 策略梯度 与前面的基于价值的算法不同&#xff0c;这类算法直接对策略本身进行近似优化。 在这种情况下&#xff0c;我们可以将策略描述成一个带有参数 θ θ θ的连续函数…

案例032:基于微信小程序的电子商城购物平台的设计与开发

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

软件测试回归测试流程

回归测试作为软件生命周期的一个组成部分&#xff0c;在整个软件测试过程中占有很大的工作量比重&#xff0c;软件开发的各个阶段都会进行多次回归测试。在渐进和快速迭代开发中&#xff0c;新版本的连续发布使回归测试进行的更加频繁&#xff0c;而在极端编程方法中&#xff0…

堆的应用:堆排序

文章目录 前言堆排序的实现&#xff08;升序为例&#xff09;代码 前言 堆排序&#xff0c;顾名思义是一个利用堆来完成排序的一个操作。在之前&#xff0c;小编在[C语言学习系列–&#xff1e;【关于qsort函数的详解以及它的模拟实现】] 谈到冒泡排序&#xff0c;但是冒泡排序…

CAM-Classification activation map 类激活图玩耍指南

原始论文 Learning Deep Features for Discriminative Localization 衍生论文 代码实现 torch-cam 该项目把代码打包成为了一个库&#xff0c;我们可以直接调用&#xff1b; torchcam.methods 这是上面那个项目的文档说明&#xff1b;

FreeRTOS任务创建及细节

目录 任务创建 简化的TCB结构体 创建任务堆栈和任务TCB 初始化任务TCB的成员 初始化任务堆栈 把新任务添加到就绪列表 任务创建 BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,const char * const pcName, /*lint !e971 Unqualified char types are allowed for …

Harmony入门-HelloWorld

HarmonyOS 已经出来一些时间了。也有了OpenHarmony&#xff0c;作为HarmonyOS抽离的基础架构OpenHarmony&#xff0c;贡献给开源了&#xff0c;后续独立出来&#xff0c;那可真是就要独立生态啦&#xff0c;咱们顺水行舟&#xff0c;学习学习。 1.IDE 安装 https://hmxt.org/d…

Aapche Dubbo 不安全的 Java 反序列化 (CVE-2019-17564)

漏洞描述 Apache Dubbo 是一个高性能的、基于 Java 的开源 RPC 框架。 Apache Dubbo 支持不同的协议&#xff0c;它的 HTTP 协议处理程序是 Spring Framework 的 .org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter Spring Framework 的安全警告显示&am…

VS2022 配置Qt编译环境 | winows安装Qt5.14.2 | VS2017和Qt5配置成功指南

Visual Studio 2022安装教程完文本内容较多,请耐心看完,挺有收获的,要自己多尝试哦。 文章目录 # 插件安装 如果你想用VS2022来创建QT项目,那么你首先要学会下面的操作,创建一个空白解决方案,在扩展搜索qt,并且下载两个插件(带有绿√的就是)。这里其实是一个坑:VS20…

福利来了| 200多款精选简历模板免费领,让你30秒内征服HR!

找工作是不是让你很头大&#xff1f;尤其是写简历&#xff0c;真的好痛苦啊&#xff01;我在网上找了好久&#xff0c;都没有找到合适的简历模板&#xff0c;自己做又不知道从哪里下手。 不过现在好了&#xff0c;有一个超级福利送给大家&#xff01;200多款精选简历模板免费领…

231127 刷题日报

这周值班。。多少写道题吧&#xff0c;保持每天的手感。老婆给买了lubuladong纸质书&#xff0c;加油卷。 1. 131. 分割回文串 写个这个吧&#xff0c;钉在耻辱柱上的题。 为啥没写出来&#xff1a; 1. 递归树没画对 把树枝只看做是1个字母&#xff0c;而且不清楚树枝和节点…

键盘打字盲打练习系列之刻意练习——1

一.欢迎来到我的酒馆 盲打&#xff0c;刻意练习! 目录 一.欢迎来到我的酒馆二.选择一款工具三.刻意练习 二.选择一款工具 俗话说&#xff1a;工欲善其事必先利其器。在开始之前&#xff0c;我们可以选择一款练习盲打的工具。打字软件有很多&#xff0c;还有专门练习打字的网站&…

leetCode 77.组合 + 回溯算法 (bactracking) + 剪枝 + 图解 + 笔记

77. 组合 - 力扣&#xff08;LeetCode&#xff09; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] …

Java小游戏飞翔的小鸟

游戏界面 运行界面 开发准备 1、eclipse开发工具 二、创建游戏窗口 Mains类作为主类&#xff0c;在mian方法下定义一个m1()方法&#xff0c;设置窗口。 //定义一个初始化的游戏窗口方法 public static void m1() {//获取底层窗口界面的工具类JFrame jf new JFrame();//创建…

计算机组成原理-页式存储器

文章目录 页式存储虚拟地址vs实地址页表&#xff1a;逻辑页->主存块号地址交换过程地址交换过程&#xff08;增加TLB&#xff09;总结 页式存储 把程序分散式地放到主存的不同块的地方 虚拟地址vs实地址 操作系统将逻辑地址映射到主存块中的物理地址&#xff0c;对应的物…

测试也应该具备的项目管理能力

前言 前几天在技术交流群有同学问到&#xff1a;“需求不明确&测试时间不足&#xff0c;经常加班&#xff0c;交付质量也不太好&#xff0c;该如何处理”&#xff1f; 群里其他同学很热心的给出了分析和建议&#xff0c;比如&#xff1a; 评估是否是技术问题&#xff0c…