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然后查看项目的控制台是否有对应的输出:以上就是所有内容

相关新闻

Windows系统美化终极指南:DWMBlurGlass实现全局透明模糊效果

Windows系统美化终极指南:DWMBlurGlass实现全局透明模糊效果

Windows系统美化终极指南:DWMBlurGlass实现全局透明模糊效果 【免费下载链接】DWMBlurGlass Add custom effect to global system title bar, support win10 and win11. 项目地址: https://gitcode.com/gh_mirrors/dw/DWMBlurGlass 想要让Windows 10/11系统界…

2026/7/30 16:59:38阅读更多 →
springboot如何集成kafka集群

springboot如何集成kafka集群

springboot中集成kafka,主要目的干啥呢,当然消息推送啦。不同系统之间,自身系统不同组件之间消息通信的一种方式,也可以是使用MQ。为什么要使用咱们的消息系统呢:个人看来,目的主要就是为了解耦&#xff0c…

2026/7/30 16:57:38阅读更多 →
PictureSelector图片选择器封装

PictureSelector图片选择器封装

注: 下面示例是以PictureSelector3为例。 1、添加依赖: // PictureSelector 基础 (必须) implementation io.github.lucksiege:pictureselector:v3.11.2 // 图片压缩 (按需引入) implementation io.github.lucksiege:compress:v3.11.22、封装类 public class Pictureselec…

2026/7/30 16:57:38阅读更多 →
Obsidian--ITS-Theme高级技巧:Callouts类型与布局设计完全指南

Obsidian--ITS-Theme高级技巧:Callouts类型与布局设计完全指南

Obsidian--ITS-Theme高级技巧:Callouts类型与布局设计完全指南 【免费下载链接】Obsidian--ITS-Theme Theme designed with readability and customizability in mind. Change it easily to your liking with the Style Settings plugin installed. 项目地址: htt…

2026/7/30 18:22:16阅读更多 →
基于Hadoop大数据的电信用户行为分析系统的设计与实现(源码+lw+部署文档+讲解等)

基于Hadoop大数据的电信用户行为分析系统的设计与实现(源码+lw+部署文档+讲解等)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/7/30 18:22:16阅读更多 →
AI写作精准控制:三步法提升提示词效果

AI写作精准控制:三步法提升提示词效果

1. AI写作的核心痛点与解决思路每次打开AI写作工具时,你是否也经历过这样的场景:输入了精心构思的提示词,却得到一堆似是而非的内容?要么是过于笼统的套话,要么是完全跑题的废话。作为从业五年的内容创作者&#xff0c…

2026/7/30 18:22:16阅读更多 →
Ubantu系统与Euler系统的安装

Ubantu系统与Euler系统的安装

Ubantu操作系统安装以下界面需等待系统的安装,安装成功之后,出现以下界面,选择语言(英语)键盘选择,默认回车网络IP配置如果您的Ubuntu服务器在代理服务器后面,则需要在此处输入代理服务器详细信…

2026/7/30 18:22:16阅读更多 →
数据结构-线性表、数组、矩阵

数据结构-线性表、数组、矩阵

数组数组是线性表的一种推广,是运算受限的线性表。 二维数组a[m][n],每个元素占k个存储单元,以行序为主序的存储中,a[i][j]的位置i*nj,存储地址loc[i,j]loc[0,0](i*nj)*k。矩阵的压缩存储包括稀疏矩阵(spar…

2026/7/30 18:22:16阅读更多 →
从源码到应用:JWTRefreshTokenBundle的架构设计与核心组件解析

从源码到应用:JWTRefreshTokenBundle的架构设计与核心组件解析

从源码到应用:JWTRefreshTokenBundle的架构设计与核心组件解析 【免费下载链接】JWTRefreshTokenBundle Implements a Refresh Token system over Json Web Tokens in Symfony 项目地址: https://gitcode.com/gh_mirrors/jw/JWTRefreshTokenBundle JWTRefres…

2026/7/30 18:20:15阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

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

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

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/30 15:43:46阅读更多 →