如何优雅的通过Spring Boot+Redission对订单实现定时关闭
简介
在电子商务及支付相关平台中,常规流程是首先生成订单或支付请求,用户随后会在规定时间内完成支付。如果用户未能在预设时限内完成支付动作,系统通常会执行相应的过期处理机制,即自动取消未支付的订单。
此外,这类系统还设置了多种自动化业务规则来处理其他时效性较强的场景,例如:
- 到期自动确认收货:当商品配送预计到达时间过后,若用户未主动确认收货,系统将自动视为用户已收货并触发后续评价或售后环节。
- 超时自动退款:对于某些未及时处理的退款申请,或者因物流异常等原因导致的退款,系统在达到预设等待期限后会自动退还消费者款项。
- 下单后自动通知:一旦用户下单成功,系统会自动触发短信或邮件通知服务,向用户发送订单确认信息或其他相关信息。
以上这些功能都是为了提高系统的自动化水平和用户体验,减少人工干预的需求,并确保交易过程顺畅高效
实现方式
被动关闭(不推荐)
在电子商务系统中,一旦创建了订单,系统并不会主动介入进行关闭操作,而是静待用户行为,仅当用户实际访问或查询订单状态时,系统才会实时进行评估,以判断是否满足应当关闭订单的条件。缺点就是如果用户一直没有访问订单则会导致订单一直处于未关闭的状态,这时数据库中会堆积大量垃圾数据
@Slf4j
@Service
public class PassiveShutdownServiceImpl implements OrderShutdown {@Autowiredprivate OrderMapper orderMapper;/*** 方法一:被动关闭*/@Overridepublic void orderShutdown() {//假设订单id为1Long orderId = 1L;Order order = orderMapper.findOrderById(orderId);//省略其他相关业务判断......//判断当前是否大于到期时间if(order.getExpireTime().compareTo(new Date())==-1){//修改订单状态log.info("当前时间大于到期时间");int result = orderMapper.updateOrderStatus(orderId);//省略判断是否修改成功相关逻辑}}
}
<select id="findOrderById" resultType="com.yiridancan.delayShutdown.entity.Order" parameterType="long">select * from t_order where id=#{orderId} and order_status!='CLOSED'
</select><update id="updateOrderStatus" parameterType="long">update t_order set order_status='CLOSED' where id=#{orderId}
</update>
测试代码:
@SpringBootTest
class DelayShutdownApplicationTests {@Autowiredprivate PassiveShutdownServiceImpl passiveShutdownService;/** * 延期关闭测试类。通过策略模式指定方法* @author yiridancan* @date 2024/4/3 22:56*/@Testvoid delayShutdown() {OrderShutdown orderShutdown = passiveShutdownService;orderShutdown.orderShutdown();}}
定时任务(推荐,适用于时间精准度不高的场景)
定时任务就是定时去扫描表中数据进行订单关闭,实现比较简单,就不提供具体示例代码
缺点:
-
时间不精准,如果一个订单到了关闭时间,但定时任务时间还没到,就会导致订单一直没有关闭
-
无法处理大订单量:如果数据量大的情况下,那么就有可能导致任务执行时间很长,订单被扫描到时间可能就很晚,那么就会导致关闭时间更晚
-
数据库压力大:定时任务扫描表数据,会占用数据库的IO资源。严重时会导致线上的正常业务
Redission(推荐)
Redisson是一个在Redis的基础上实现的框架,它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。可以通过Redission中的RDelayedQueue延迟队列实现订单到期关闭,它可以用于在指定的时间后执行某些操作。底层主要是用到了Redis的zset数据结构,并且在这基础上增加了一个延迟队列。我们要添加一个数据到延迟队列的时候,redisson会把数据+超时时间放到zset中,并且起一个延时任务,当任务到期的时候,再去zset中把数据取出来,返回给客户端使用。
1.添加依赖

2.配置Redission
创建一个Redission配置类,用于创建Redission


3.创建订单服务
创建一个订单服务类,使用 RDelayedQueue 来实现订单到期关闭的逻辑:

4.创建订单
创建订单controller层,用于模拟订单创建并设置关闭时间

5.启动应用
启动应用并访问http://ip:host/orders/create?expireTime=关闭时间进行默认订单创建

运行效果
创建订单成功:

Redis队列数据:

到期关闭结果:
可见2分钟后订单id为:2024-10-12 13:43:21定时关闭了


6.注意事项
- 确保Redis服务器正在运行
- 根据需要调整延迟时间和其他业务逻辑
- 处理并发和异常处理,以确保在实际环境中的可靠性
- 如遇到以下异常,升级Redis版本进行处理

Redission案例源码地址:如何优雅的通过SpringBoot+Redission对订单实现定时关闭资源-CSDN文库
总结
这里只列举了部分实现方式,比如还可以通过MQ(不推荐,会有大量无效调度数据)、时间轮、Redis的过期监听等。不同的场景适用于不同的技术方案,没有决定的技术
在CSDN上,一键三连是对作者辛勤创作的最好鼓励!喜欢我的文章,就请点赞、收藏、转发吧!你们的支持是我持续分享知识的动力,感谢大家的陪伴与认可!💖🔝🔄
相关文章:
如何优雅的通过Spring Boot+Redission对订单实现定时关闭
简介 在电子商务及支付相关平台中,常规流程是首先生成订单或支付请求,用户随后会在规定时间内完成支付。如果用户未能在预设时限内完成支付动作,系统通常会执行相应的过期处理机制,即自动取消未支付的订单。 此外,这…...
二、IPD 的定义与背景
IPD 的定义与背景 1. IPD的定义 集成产品开发(Integrated Product Development,简称IPD)是一种系统化的产品开发模式,强调市场需求导向和跨职能团队的紧密合作,通过并行工程缩短开发周期、降低开发风险和成本。其核心目标是提高产品的市场竞争力,确保产品在开发各阶段都…...
STM32CubeMX初始生成工程
STM32CubeMX初始生成工程 STM32CubeMX软件可以很容易的配置STM32 MCU,例如引脚配置(Pins)、时钟树(Clock Tree)、外设(Peripherals)、中间件(Middleware)等 使用STM32CubeMX软件可以快速配置STM32工程,生成Keil工程文件以及初始化生成统一风格的C代码&…...
STM32单片机(F03C8T6)-点灯(寄存器点灯和库函数点灯)
作者:Whappy 时间:2024.10.9 日志:本实验是我第一个32位单片机实验程序,如有不足请指点! #include "stm32f10x.h" // Device headerint main(void) {//寄存器点灯RCC->APB2ENR 0x000…...
PCL 3D-SIFT关键点检测(曲率不变特征约束
PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、概述 3D-SIFT(Scale-Invariant Feature Transform)关键点检测是用于点云分析的一种有效方法,具有尺度不变性和旋转不变性。在处理复杂场景和物体识别时,通过对点云…...
Android上的AES加密
基础算法说明 https://www.youtube.com/watch?vlnKPoWZnNNM 虽然这个视频讲的非常详细,但是涉及到具体底层算法,大致流程 1. 将数据转成HEX或者byte array 2.将数据分层一块块等大小的数据 3.将数据和key 进行一次混合,加密之后的输出&…...
安全测试的漏洞类型
目录 一、安全测试的定义 二、安全测试的分类 1、静态扫描 2、内存扫描 3、动态安全测试 三、安全测试主要关注哪些方面的漏洞 漏洞一:SQL注入 漏洞二:XSS 漏洞三:暴力破解 漏洞四:文件包含文件上传漏洞 漏洞五&#…...
51 | 适配器模式:代理、适配器、桥接、装饰,这四个模式有何区别?
前面几篇文章我们学习了代理模式、桥接模式、装饰器模式,今天,我们再来学习一个比较常用的结构型模式:适配器模式。这个模式相对来说还是比较简单、好理解的,应用场景也很具体,总体上来讲比较好掌握。 关于适配器模式…...
ORM框架简介
什么是ORM? ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,用于在关系数据库和对象程序语言之间转换数据。ORM框架允许开发者以面向对象的方式来操作数据库,而不需要编写复杂的SQL语句。简单…...
Windows系统上根据端口号查找对应进程
“开始”-“运行”,输入cmd,打开命令行窗口,输入netstat和findstr的组合,找出占用了4118的端口的进程 根据上述PID,使用tasklist和findstr的组合,找出对应进程是dsa.exe 要想kill此进程,可以打开…...
一文通透OpenAI o1:从CoT、Quiet-STaR、Self-Correct、Self-play RL、MCST等技术细节到工程复现
前言 注意,本文自10.12日起,正在每天更新的过程中,包括已写的部分也在不断修改(以增加更多技术细节、更加通俗易懂) 预计10.20完成第一版,10月底修订到第二版——具体修订记录详见本文文末.. 可能是去年写或讲的关于ChatGPT原理的…...
如何解决与kernel32.dll相关的常见错误:详细指南解析kernel32.dll文件缺失、损坏或错误加载问题
当你的电脑中出现错误kernel32.dll丢失的问题,会导致电脑不能出现正常运行,希望能够有效的帮助你有效的将丢失的kernel32.dll文件进行修复同时也给大家介绍一些关于kernel32.dll文件的相关介绍,希望能够有效的帮助你快速修复错误。 kernel32.…...
Caffeine Cache解析(一):接口设计与TinyLFU
Caffeine is a high performance Java caching library providing a near optimal hit rate. 自动加载value, 支持异步加载基于size的eviction:frequency and recency基于时间的过期策略:last access or last write异步更新valuekey支持weak referenceva…...
深入探索LINUX中AWK命令:强大的文本处理工具
深入探索LINUX中AWK命令:强大的文本处理工具 AWK 是一种编程语言,专为文本和数据处理设计,它以其强大的文本处理能力和简洁的语法在 Unix/Linux 系统中占据了重要地位。AWK 程序由一系列的模式(pattern)和动作(action)组成,对于输…...
数字化转型:解决项目管理困境的新路径
在当今这个飞速发展的数字化时代,企业如同在汹涌波涛中航行的船只,承受着前所未有的变革压力。而作为企业运作核心环节之一的项目管理,同样面临着巨大的挑战。 传统项目管理模式中的种种问题,犹如顽固的礁石,阻碍着项目…...
Arthas常用的命令(三)--monitor、jad 、stack
monitor:监控方法的执行情况 监控指定类中方法的执行情况 用来监视一个时间段中指定方法的执行次数,成功次数,失败次数,耗时等这些信息 参数说明 方法拥有一个命名参数 [c:],意思是统计周期(cycle of ou…...
Power BI之常用DAX函数使用介绍——提供数据源练习
前述: 本次使用数据是包含产品表、客户表、区域表、销售订单表的一份销售订单数据,数据源链接如下: 链接:https://pan.baidu.com/s/1micl_09hFrgz2aUBERkeZg 提取码:y17e 一、CALCULATE 1.语法结构 语法结构CALCUL…...
SQL-触发器(trigger)的详解以及代码演示
一、触发器的概念 触发器是一种特殊的存储过程,但是触发器不存在输入和输出参数,所以不能被显式的去调用,而是与特定的表相关联,当表中的数据发生变化时,触发器被激活并执行其定义的SQL代码。触发器可以是行级触发器&…...
【devops】x-ui 实现一键安装 x-ray 打造高速国际冲浪 | xray管理平台
一、部署X-UI篇 1、Github 地址&说明 github地址如下: https://github.com/FranzKafkaYu/x-ui?tabreadme-ov-file 2、一键部署 2.1、更新并安装curl #Ubuntu、Deibian系统 apt update && apt upgrade -y apt install curl -y #CentOS7 系统 yum…...
Linux系统编程——进程标识、进程创建
一、进程标识(pid) 每个进程都有一个非负整数形式的唯一编号,即 PID。PID 在任何时刻都是唯一的,但是可以重用,当进程终止并被回收以后,其 PID 就可以为其它进程所用。进程的 PID 由系统内核根据延迟重用算…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
