springboot利用redis过期事件处理过期订单

前言

在开发中我们经常会遇到这样的业务需求,某一条数据需要在xxx时间后处理,比如说未支付的订单,30分钟后过期。能够实现这一功能的技术有很多,但需要你根据系统的大小、业务的量的大小以及公司给到该项目的资源而决定。

比如说这是一个大商城,开始之初就已经部署了rabbitmq,那毫无疑问可以使用延时队列实现这一功能。如果说没有提供mq,一般情况下我们就定时轮询订单表了,这是非常最简单的一种实现方式。如果说你怕数据库压力大,那不妨可以选择redis。这篇文章介绍的就是如何利用redis处理过期事件。

实现

1.开启配置

打开redis.conf,开启如下配置

notify-keyspace-events Ex

这是为了使 Redis Key 过期事件能够被监听 ,需要启用 Redis 的键空间通知功能

2.创建监听器类

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;@Slf4j
public class RedisKeyExpiredListener implements MessageListener {@Overridepublic void onMessage(Message message, byte[] pattern) {String expiredKey = message.toString();log.info("获取数据:"+expiredKey);if (expiredKey.startsWith("order:")) {// 一般来说,我们会这样设置过期订单的key:"order:255 "String orderId = expiredKey.split(":")[1];log.info("订单ID:"+orderId);// 处理实际业务}}
}

3.将监听器注册为 Bean

import com.gpt.dc.web.listener.RedisKeyExpiredListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;@Configuration
public class RedisConfig {@Beanpublic RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory,RedisKeyExpiredListener listener) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);// 配置监听的 Redis Key 过期事件的频道container.addMessageListener(listener, new PatternTopic("__keyevent@*__:expired"));return container;}@Beanpublic RedisKeyExpiredListener redisKeyExpiredListener() {return new RedisKeyExpiredListener();}
}

我们在配置类 RedisConfig 中将监听器注册为 Bean,并通过 RedisMessageListenerContainer 配置监听容器。我们使用 addMessageListener() 方法来添加监听器,并指定要监听的 Redis Key 过期事件的频道(__keyevent@*__:expired

接下来测试一下

@GetMapping("save")
public void saveOrder(Long id){RedisUtil.set("order:"+id, id.toString(), 10L);
}

10后过期,RedisKeyExpiredListener中的onMessage方法会自动监听,并在控制台上打印如下信息

c.g.d.w.l.RedisKeyExpiredListener:17   redisMessageListenerContainer-1                    获取数据:order:2
c.g.d.w.l.RedisKeyExpiredListener:20   redisMessageListenerContainer-1                    订单ID:2

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

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

相关文章

帝国CMS仿核弹头H5小游戏模板/帝国CMS内核仿游戏网整站源码

帝国CMS仿核弹头H5小游戏模板,帝国CMS内核仿游戏网整站源码。比较适合小游戏发布、APP应用资讯类网站使用,有兴趣的可以二次开发试试。 下载地址:https://bbs.csdn.net/topics/617579435

jenkins+centos7上传发布net6+gitlab

工作中实践了一下jenkins的操作,所以记录一下这次经验,没有使用到docker 先看下成果: 选择发布项目 选择要发布的分支 构建中 发布成功 开始 首先安装好jenkins并注册自己的jenkins账号 因为我们的项目代码管理使用的是gitlab&#xff0c…

C语言指针详解(1)(能看懂字就能明白系列)文章超长,慢慢品尝

目录 1、内存和地址 2、指针简介 与指针相关的运算符: 取地址操作符(&) 解引用操作符(间接操作符)(*) ​编辑 指针变量的声明 指针变量类型的意义 指针的基本操作 1、指针与整数相加…

(论文阅读)TiDB:一款基于Raft的HTAP数据库

引言 混合事务分析处理(HTAP)数据库要求隔离处理事务查询和分析查询,以消除它们之间的干扰。要实现这一点,有必要维护为这两种查询类型指定的数据的不同副本。然而,为存储系统中的分布式副本提供一致的视图是一项挑战…

后端接口性能优化分析-数据库优化

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码🔥如果感觉博主的文章还不错的话,请👍三连支持&…

ROS话题(Topic)通信:自定义msg - 例程与讲解

在 ROS 通信协议中,数据是以约定好的结构传输的,即数据类型,比如Topic使用的msg,Service使用的srv,ROS 中的 std_msgs 封装了一些原生的数据类型,比如:Bool、Char、Float32、Int64、String等&am…

002 OpenCV dft 傅里叶变换

目录 一、傅里叶变换 1.1 傅里叶变换概念 1.2 opencv中傅里叶变换 二、实验代码 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、傅里叶变换 2.1 傅里叶变换概念 傅里叶变换(Fourier Transform)是一种…

Java怎么对复杂的数据类型排序和比大小

目录 一.对复杂的数据类型比大小 Comparable接口 compareTo方法 二.对复杂数据类型排序 三.总结 一.对复杂的数据类型比大小 假如我们现在有个学生类,并且我们实例化出了俩个学生对象,他们各自有各自的名字和年龄属性,我们如何对他们进…

【C语言】深入解开指针(三)

🌈write in front :🔍个人主页 : 啊森要自信的主页 真正相信奇迹的家伙,本身和奇迹一样了不起啊! 欢迎大家关注🔍点赞👍收藏⭐️留言📝>希望看完我的文章对你有小小的帮助&#x…

springboot项目的可执行jar以后台本地服务的方式运行在Windows机器上

文章目录 用到的工具先上一个效果图准备可执行文件注册及启动服务 前段时间遇到一个项目,需要我们提供一个驱动控件,可以以后台服务的方式运行在Windows机器上。开始寻找各种解决办法。 最后发现一个不错的解决方式。分享给大家一下。 用到的工具 链接&…

4种智慧路灯典型应用场景介绍

智慧路灯是一种通过集成先进技术和智能系统的道路照明设施。它不仅具备传统灯杆的基本功能,还具有灯具、传感器、通信设备、监控摄像头等多个功能模块。可以实现智能照明、环境监测、安全监控、交通管理等多种功能,为城市的智慧化建设和市民的生活提供更…

验证k8s中HPA功能及测试

部署 使用yaml部署服务 apiVersion: apps/v1 kind: Deployment metadata:name: php-apachenamespace: tools spec:replicas: 1selector:matchLabels:app: php-apachetemplate:metadata:labels:app: php-apachespec:containers:- name: php-apacheimage: registry.cn-beijing.…

基于JavaWeb+SpringBoot+Vue电子商城微信小程序系统的设计和实现

基于JavaWebSpringBootVue电子商城微信小程序系统的设计和实现 源码获取入口前言系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 身处互联网时代,互联网无形中影响着人们的吃穿住行,人们享受着不…

基于SSM+Vue的校园共享单车管理系统

基于SSMVue的校园共享单车管理系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringMyBatisSpringMVC工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 登录界面 管理员界面 用户界面 摘要 随着城市交通的不断发展和人们出…

asp.net core mvc之 RAZOR共享指令和标签助手 TagHelpers

一、RAZOR共享指令 RAZOR共享指令:在视图中导入命名空间,执行依赖注入。 RAZOR共享指令是写在 Views目录下的 _ViewImports.cshtml 文件 支持指令如下: addTagHelper 增加标签助手 removeTagHelper 移除标签助手 tagHelperPrefix 标签助手…

【flink理论】动态表:关系查询处理流的思路:连续查询、状态维护;表转换为流需要编码编码

文章目录 一. 使用关系查询处理流的讨论二. 动态表 & 连续查询(Continuous Query)三. 在流上定义表1. 连续查询2. 查询限制2.1. 维护状态2.2. 计算更新 四. 表到流的转换1. Append-only 流2. Retract 流3. Upsert 流 本文主要讨论了: 讨论通过关系查询处理无界流…

flutter ios Exception : No Impeller Context is Available

在模拟器上运行 ios 项目的时候,图片显示不出来。真机可以显示 原因:ios默认启用 impeller(新渲染引擎),不知道为什么项目不能使用。 禁用掉即可, 原因以及解决都在下面的链接里面了 Impeller rendering …

Django+vue前后端分离实战--vue后台管理系统--vue环境安装项目创建

Djangovue前后端分离实战--vue后台管理系统 安装nodejsvue clivue-cli创建项目 安装nodejsvue cli 1、下载nodejs并安装 https://nodejs.org/dist/v20.9.0/node-v20.9.0-x64.msi 2、修改npm 默认仓库地址,要修改成taobao的镜像npm 仓库地址 cmd下命令&#xff1a…

系列八、JVM的内存结构【方法区】

一、概述 方法区是一个供各线程共享的运行时内存区域。它存储了每一个类的结构信息,例如运行时常量池(Runtime Constant Pool)、字段和方法数据、构造函数和普通方法的字节码内容。上面讲的是规范,在不同的虚拟机里面实现是不一样…

74基于matlab的PSO-ELM的多输入,单输出结果预测,输出训练集和测试机预测结果及误差。

基于matlab的PSO-ELM的多输入,单输出结果预测,输出训练集和测试机预测结果及误差,适应度值。数据可更换自己的,程序已调通,可直接运行。 74matlabPSO-ELM多输入单输出 (xiaohongshu.com)