redis 自定义事件监听,支持单机、集群、哨兵
为什么要自定义事件监听呢当然是为了在redis进行某些事件动作的时候增加一些咱们自己的业务逻辑处理比如当key失效的时候处理业务逻辑--支付订单半小时未支付就自动取消订单。这就可以用key失效事件监听来实现。下面就来讲解怎么实现1.首先自定义一个消息工厂此处不要自己再重新获取连接自定义连接池。直接使用redis现有的连接池即可。package com.liu.redisexpired; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.data.redis.connection.MessageListener; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.listener.PatternTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import reactor.util.annotation.NonNull; /** * 自定义Redis键空间监听器⼯⼚ * author kevin * date 2022/6/7 */ Slf4j public class RedisMessageListenerFactory implements BeanFactoryAware, ApplicationListenerContextRefreshedEvent { //spring bean工厂 private DefaultListableBeanFactory beanFactory; //redis连接工厂 private RedisConnectionFactory redisConnectionFactory; //redis消息监听 Autowired private MessageListener messageListener; public void setBeanFactory(NonNull BeanFactory beanFactory) { this.beanFactory (DefaultListableBeanFactory) beanFactory; } public void setRedisConnectionFactory(RedisConnectionFactory redisConnectionFactory) { this.redisConnectionFactory redisConnectionFactory; } /** * 自定义事件监听 * author kevin * date 2022/5/27 */ Override public void onApplicationEvent(NonNull ContextRefreshedEvent contextRefreshedEvent) { //定义一个单例bean设置连接工厂为redis的连接工厂然后注册到spring容器 BeanDefinitionBuilder containerBeanDefinitionBuilder BeanDefinitionBuilder .genericBeanDefinition(RedisMessageListenerContainer.class); containerBeanDefinitionBuilder.addPropertyValue(connectionFactory, redisConnectionFactory); containerBeanDefinitionBuilder.setScope(BeanDefinition.SCOPE_SINGLETON); containerBeanDefinitionBuilder.setLazyInit(false); beanFactory.registerBeanDefinition(myRedisKeyListenerContainer, containerBeanDefinitionBuilder.getRawBeanDefinition()); //从spring工厂容器获取消息监听容器配置消息监听器 RedisMessageListenerContainer container beanFactory.getBean(myRedisKeyListenerContainer, RedisMessageListenerContainer.class); //设置监听正则监听节点所有key的所有事件 container.addMessageListener(messageListener, new PatternTopic(__keyevent*__:*)); container.afterPropertiesSet(); //开始监听 container.start(); } }2.将消息工厂注入spring容器在你的redisconfig配置中加入代码主要看最后一个方法package com.liu.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; import com.liu.redisexpired.RedisMessageListenerFactory; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; Configuration public class RedisConfig { /** * 配置第一个数据源的RedisTemplate * 注意这里指定使用名称factory 的 RedisConnectionFactory * 并且标识第一个数据源是默认数据源 Primary * author kevin * param redisConnectionFactory : * return org.springframework.data.redis.core.RedisTemplate * date 2022/5/26 */ Bean(redisTemplate) Primary public RedisTemplateString, Object redisTemplate(RedisConnectionFactory redisConnectionFactory) { return getRedisTemplate(redisConnectionFactory); } /** * redis操作工具获取redisTemplate * author kevin * param factory : redis连接工厂 * return org.springframework.data.redis.core.RedisTemplatejava.lang.String,java.lang.Object * date 2022/5/27 12:00 */ private RedisTemplateString, Object getRedisTemplate(RedisConnectionFactory factory) { RedisTemplateString, Object template new RedisTemplate(); template.setConnectionFactory(factory); Jackson2JsonRedisSerializerObject jackson2JsonRedisSerializer new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL) //过期方法 om.activateDefaultTyping( LaissezFaireSubTypeValidator.instance , ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY); jackson2JsonRedisSerializer.setObjectMapper(om); StringRedisSerializer stringRedisSerializer new StringRedisSerializer(); // key采用String的序列化方式 template.setKeySerializer(stringRedisSerializer); // hash的key也采用String的序列化方式 template.setHashKeySerializer(stringRedisSerializer); // value序列化方式采用jackson template.setValueSerializer(jackson2JsonRedisSerializer); // hash的value序列化方式采用jackson template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } /** * 自定义redis消息监听工厂 * author kevin * date 2022/5/27 */ Bean public RedisMessageListenerFactory redisMessageListenerFactory( BeanFactory beanFactory, RedisConnectionFactory redisConnectionFactory) { RedisMessageListenerFactory beans new RedisMessageListenerFactory(); beans.setBeanFactory(beanFactory); beans.setRedisConnectionFactory(redisConnectionFactory); return beans; } }3.编写消息监听编写一个监听器实现MessageListener接口实现onMessage方法得到的message就可以监听所有的key的事件了。此处只监听了key的过期事件然后打印了一句日志如果需要其他操作可直接在此处改写即可package com.liu.redisexpired; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageListener; import org.springframework.stereotype.Component; /** * 事件触发监听器 * author kevin * date 2022/5/27 */ Slf4j Component public class KeyEventMessageListener implements MessageListener { /** * 监听获取redis键消息 * author kevin * param message : 事件消息体 * param pattern : 事件监听,消息主题订阅频道如 * __keyevent*__:* 所有key的所有事件 __keyeventa__:* key为a的所有事件 * __keyeventa__:expired key为a的key过期事件 * date 2022/5/27 11:05 */ Override public void onMessage(Message message, byte[] pattern) { //获取redis操作类型: set、expire、expired等操作 String action new String(message.getChannel()); action action.split(:)[1]; //获取redis操作的key String key new String(message.getBody()); //判断失效的key,且是请求限流的key if(expired.equals(action) key.startsWith(request_limit_)){ log.info(监听到的键{},已经失效请求限流已取消, key); } } }此处作者监听的是以request_limit_开头的键失效事件做接口限流的时候顺便整了一下键事件监听。4. 然后验证启动你的项目然后使用你的项目设置一个键并设置失效事件或者直接连接redis命令行先通过如下命令连接redis命令行redis-cli -h 127.0.0.1 -p 6379 -a xxx在命令行中执行命令添加一个键值并设置过期时间为2秒:set request_limit_test 1 PX 2000然后查看项目的控制台是否有对应的输出:以上就是所有内容

相关新闻

3个技术方案解决桌面互动痛点:BongoCat如何用跨平台桌宠提升工作效率

3个技术方案解决桌面互动痛点:BongoCat如何用跨平台桌宠提升工作效率

3个技术方案解决桌面互动痛点:BongoCat如何用跨平台桌宠提升工作效率 【免费下载链接】BongoCat 🐱 跨平台互动桌宠 BongoCat,为桌面增添乐趣! 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat BongoCat是一款基于…

2026/7/30 16:58:18 阅读更多 →
Modern-Screenshot深度解析:现代Web截图解决方案的架构设计与最佳实践

Modern-Screenshot深度解析:现代Web截图解决方案的架构设计与最佳实践

Modern-Screenshot深度解析:现代Web截图解决方案的架构设计与最佳实践 【免费下载链接】modern-screenshot 📸 Quickly generate image from DOM node using HTML5 canvas and SVG. 项目地址: https://gitcode.com/gh_mirrors/mo/modern-screenshot …

2026/7/30 16:58:18 阅读更多 →
企业级RAG应用:GPT-5.6长上下文检索与推理闭环实测

企业级RAG应用:GPT-5.6长上下文检索与推理闭环实测

企业知识库接入大模型后,最容易被误判的一件事是:只要RAG检索命中了正确文档,回答质量就应该没问题。 实际落地时完全相反——向量检索把制度、接口说明、历史工单都找全了,GPT也能把内容组织得逻辑通顺,但业务同事还是…

2026/7/30 16:58:17 阅读更多 →

最新新闻

三色标记算法详解(面试题)

三色标记算法详解(面试题)

三色标记算法详解(面试题) 本文档涵盖以下面试题,逐题给出详细答案: 三色标记算法了解吗? 三色标记优点? 标记过程? 产生的问题? 一、三色标记算法了解吗? 1.1 什么是三色标记算法 三色标记算法(Tri-color Marking)是一种并发垃圾标记算法,最早由 Dijkstra 等人提…

2026/7/30 17:06:21 阅读更多 →
界面控件DevExpress VCL v26.1新版亮点 - 支持Fluent UI

界面控件DevExpress VCL v26.1新版亮点 - 支持Fluent UI

DevExpress VCL能帮助用户快速创建良好的用户体验,提供高影响力的业务解决方案,同时能利用现有的VCL技能来构建面向明天的下一代应用程序。 在上文中为大家介绍DevExpress VCL v26.1中的其他VCL报表和BI Dashboard功能增强(点击这里回顾>…

2026/7/30 17:06:21 阅读更多 →
中国大模型全球份额碾压式领先:数据之外,我们该冷静看什么?

中国大模型全球份额碾压式领先:数据之外,我们该冷静看什么?

2026年7月28日,一组数据刷屏了AI圈:OpenRouter平台最新统计显示,中国AI大模型的全球Token调用量份额已达63.5%,美国模型仅占35.5%。周调用量33万亿Token对2.34万亿Token,差距约14倍。7月调用量前五名全部是中国模型——…

2026/7/30 17:06:21 阅读更多 →
192、CCM模组设计:金线键合与陶瓷基板在量产中的可靠性挑战

192、CCM模组设计:金线键合与陶瓷基板在量产中的可靠性挑战

192、CCM模组设计:金线键合与陶瓷基板在量产中的可靠性挑战 去年夏天,某款旗舰机的前摄模组在高温高湿老化测试中,连续三批样品出现图像暗角、闪烁甚至黑屏。产线那边急得跳脚,说良率从95%直接掉到70%。我带着示波器和红外热像仪蹲在产线三天,最后发现是金线键合在陶瓷基板…

2026/7/30 17:06:21 阅读更多 →
滑动滤波函数

滑动滤波函数

滑动滤波函数INT16U digital_slide_filter(INT16U *data, INT16U len, INT16U value) {INT16U i;INT16U max data[0], min data[0];INT32U sum 0;for(i 0; i < len - 1; i){ if(max < data[i]){max data[i];} if(min > data[i]){min data[i];}data[i] data[i …

2026/7/30 17:06:21 阅读更多 →
企业数据安全防护体系构建与关键技术解析

企业数据安全防护体系构建与关键技术解析

1. 企业数据安全防护的现状与挑战现代企业运营过程中&#xff0c;数据资产已经成为最核心的竞争力之一。从客户信息、交易记录到商业机密、研发数据&#xff0c;这些数字资产的安全直接关系到企业的生存与发展。然而随着数字化转型的深入&#xff0c;数据安全威胁也呈现出新的特…

2026/7/30 17:05:20 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具&#xff1a;DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼&#xff1f;是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper&#xff1a;网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具&#xff0c;它并非替代教师&#xff0c;而是通过语义理解、知识图谱与多模态生成能力&#xff0c;将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档&#xff0c;可以直接使用&#xff01;系统支持图片、视频、摄像头等多种方式检测裂缝&#xff0c;功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像&#xff01; pubg绝地求生目标检测数据集 1分类&#xff1a;e_body&#xff0c;14905个标签&#xff0c;txt格式 共计14244张图&#xff0c;99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别&#xff1a; allies enemy tag图片总量&#xff1a;7247张训练集&#xff1a;5139张验证集&#xff1a;1425张测试集&#xff1a;683张标注状态&#xff1a;全部已标注&#xff0c;即拿即用数据格式&#xff1a;支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻