当前位置: 首页 > news >正文

简单实现监听redis的Key过期事件

一,背景

公司的订单服务需要实现一个30分钟没付款自动取消的功能, 前面的程序员小弟用了一个定时任务来自动关闭订单,被发现之后,直接fire掉了哈哈哈哈。 这里就用redis来实现一个到时关闭订单的功能。


二,实现

1, 开启redis推送事件的设置

在redis.conf文件中找到EVENT NOTIFICATION部分,找到notify-keyspace-events设置,它的默认值是空字符串,就是不推送事件信息。如果要推送所有信息,就可以设置为Elg, 如果只需要推送key过期事件,就设置为Ex。  这里我们设置为Ex,然后重启redis。

2,添加RedisMessageListenerContainer
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.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {@Bean("redisTemplate")public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// 使用Jackson序列化Jackson2JsonRedisSerializer<Object> serializer =new Jackson2JsonRedisSerializer<>(Object.class);// Key使用String序列化redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());// Value使用JSON序列化redisTemplate.setValueSerializer(serializer);redisTemplate.setHashValueSerializer(serializer);redisTemplate.afterPropertiesSet();return redisTemplate;}@BeanRedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);return container;}
}

3,添加Redis事件监听器
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}/*** 针对redis数据失效事件,进行数据处理** @param message* @param pattern*/@Overridepublic void onMessage(Message message, byte[] pattern) {log.info("Redis key 过期:{}", message);if (message.toString().startsWith("order_")) {// todo: 订单过期, 修改订单状态逻辑} else if (message.toString().contains("user:token:xxxxxxxxxxx")) {log.info("用户token过期,进行用户登出");// todo: 用户登出} else {log.info("其他key过期");}}
}

4,生成订单之后,将订单号放入redis,key是order_开始的,这段儿是常规使用redis的操作就省略了。

http://www.dtcms.com/a/339037.html

相关文章:

  • Shopee本土店账号安全运营:规避封禁风险的多维策略
  • 微服务-08.微服务拆分-拆分商品服务
  • 什么是强化学习
  • JMeter高级性能测试训练营 – 从入门到企业级实战
  • pytest高级用法之插件开发
  • Quartus Prime 18.1网盘资源下载与安装指南
  • 从线性回归到神经网络到自注意力机制 —— 激活函数与参数的演进
  • Berry Material React TypeScript 管理后台使用教程 v0.1.0
  • 手写C++ string类实现详解
  • React 新拟态登录页面使用教程
  • 星图云开发者平台新功能速递 | 微服务管理器:无缝整合异构服务,释放云原生开发潜能
  • C++入门自学Day14-- Stack和Queue的自实现(适配器)
  • [Android] 显示的内容被导航栏这挡住
  • STM32 定时器(输出模式)
  • 开源游戏引擎Bevy 和 Godot
  • 开源AI工具Midscene.js
  • 第9章 React与TypeScript
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(17):文法+单词第5回3-复习
  • 指针的应用学习日记
  • GraphQL 与 REST 在微服务架构中的对比与设计实践
  • RadioIrqProcess函数详细分析与流程图
  • C#语言的语法(数据类型)
  • 清空 github 仓库的历史提交记录(创建新分支)
  • 神经网络中的那些关键设计:从输入输出到参数更新
  • STranslate:一键聚合翻译+OCR,效率翻倍
  • 云端赋能,智慧运维:分布式光伏电站一体化监控平台研究
  • 卫生许可证识别技术:通过OCR与NLP实现高效合规管理,提升审核准确性与效率
  • Git#revert
  • 如何解析PDF中的复杂表格数据
  • 星链之供应链:SpaceX供应链韧性密码,70%内部制造+模块化设计,传统航天企业如何追赶?