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/11/10 6:24:58 阅读更多 →
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/11/10 17:28:39 阅读更多 →
企业级RAG应用:GPT-5.6长上下文检索与推理闭环实测

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

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

2026/11/12 2:47:48 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/13 5:13:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/13 5:13:25 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/13 5:13:25 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/12 18:22:26 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/12 18:22:25 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/13 5:13:25 阅读更多 →

日新闻

周新闻

月新闻