超时未支付算不算取消一次订单_订单超过二十四小时未付款,就取消,实现该功能的几种姿态...

本文主要是介绍超时未支付算不算取消一次订单_订单超过二十四小时未付款,就取消,实现该功能的几种姿态...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

efa014da920c

网上商城有一个很常见的应用场景:一个订单未付费,二十四小时后自动取消,这个在程序上如何实现,有几种实现方法,每种方法的利弊是什么?

第一种方法:写个定时任务,在某个时间节点,定时检索订单表,有超过二十四小时的订单,统统修改为订单已取消;

实现难易程度:很容易实现,写个定时任务就可以了。

利:不会漏掉订单,只要是超过二十四小时未付款的订单,都可以被检索到、取消掉。

弊:不管有没有订单生成,有没有超过二十四小时未付款的订单,到了时间就必须去数据库检索。另外定在一个特定的时间点去执行数据库查询,会有过期未付款的订单处理的没那么及时。

定时任务代码实现参考:

第二种方法:在订单生成的时候,就把订单号放在缓存里,或是异步任务里,让它等待二十四小时;二十四小时后,再根据订单号去数据库中检索,查看该订单是否付款,如果已经付款了,操作结束;否则,执行订单取消的动作。

实现难易程度:很容易实现,写个异步的任务,到点后,再跟踪该订单的付款状态就可以了。

利:没有订单生成,就不用去数据检索;有订单生成,到点后,才根据订单号去数据库检索,检索到了未付款的订单,再做取消订单的动作。

弊:放在缓存里,或异步任务里,如果遇到服务器异常,被迫重启了,那么这个订单号就丢失了,就会有遗漏的该取消却未取消的订单。如果生成的订单很多,那么就会堆积很多异步任务,会不会影响性能呢,不好说。

线程代码实现参考:

睡二十四个小时,如何睡?

代码实现一:

public static void main(String[] argo){

try {

for(int i=0;i<10;i++){

//睡3秒钟,24小时 = 24 * 60 * 60 * 1000

System.currentTimeMillis();

Thread.sleep(3*1000);

System.out.println(System.currentTimeMillis() + ":" +i);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

打印执行结果:

1605789092882:0

一句代码,就让它睡了。

二十四后执行,不一定睡,还可以使用 Java定时器

代码实现二:

/**

* 测试用例,java定时器

* @param argo

*

*/

public static void main(String[] argo){

System.out.println(System.currentTimeMillis());

Timer timer = new Timer();

timer.schedule(new TimerTask(){

@Override

public void run() {

System.out.println(System.currentTimeMillis() + ": 执行任务");

}

}, 3 *1000); //3秒后执行,24小时 = 24 * 60 * 60 * 1000

}

执行结果:

1605789480093

以上两种方法都有不足之处,一个耗费性能,没有订单也要白白执行了一次数据库查询;另一个担心服务器重启,还需要补救措施。

在实际操作中,也可以使用第一种方法,忽略对性能的影响;也可以使用第二种,忽略服务器的重启,或者做补救措施,对遗漏的超时未付款订单人工处理,这就需要在管理后台有个操作订单的界面了。

还有没有其他更好的处理方式呢,当然是有的,比如结合redis的使用,利用redis的过期机制,这也是一种思路。

相关redis使用参考

这篇关于超时未支付算不算取消一次订单_订单超过二十四小时未付款,就取消,实现该功能的几种姿态...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/161952

相关文章

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代

SpringBoot实现接口数据加解密的三种实战方案

《SpringBoot实现接口数据加解密的三种实战方案》在金融支付、用户隐私信息传输等场景中,接口数据若以明文传输,极易被中间人攻击窃取,SpringBoot提供了多种优雅的加解密实现方案,本文将从原... 目录一、为什么需要接口数据加解密?二、核心加解密算法选择1. 对称加密(AES)2. 非对称加密(R

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

python通过curl实现访问deepseek的API

《python通过curl实现访问deepseek的API》这篇文章主要为大家详细介绍了python如何通过curl实现访问deepseek的API,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... API申请和充值下面是deepeek的API网站https://platform.deepsee

macOS Sequoia 15.5 发布: 改进邮件和屏幕使用时间功能

《macOSSequoia15.5发布:改进邮件和屏幕使用时间功能》经过常规Beta测试后,新的macOSSequoia15.5现已公开发布,但重要的新功能将被保留到WWDC和... MACOS Sequoia 15.5 正式发布!本次更新为 Mac 用户带来了一系列功能强化、错误修复和安全性提升,进一步增

SpringBoot实现二维码生成的详细步骤与完整代码

《SpringBoot实现二维码生成的详细步骤与完整代码》如今,二维码的应用场景非常广泛,从支付到信息分享,二维码都扮演着重要角色,SpringBoot是一个非常流行的Java基于Spring框架的微... 目录一、环境搭建二、创建 Spring Boot 项目三、引入二维码生成依赖四、编写二维码生成代码五

MyBatisX逆向工程的实现示例

《MyBatisX逆向工程的实现示例》本文主要介绍了MyBatisX逆向工程的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录逆向工程准备好数据库、表安装MyBATisX插件项目连接数据库引入依赖pom.XML生成实体类、

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

Java实现MinIO文件上传的加解密操作

《Java实现MinIO文件上传的加解密操作》在云存储场景中,数据安全是核心需求之一,MinIO作为高性能对象存储服务,支持通过客户端加密(CSE)在数据上传前完成加密,下面我们来看看如何通过Java... 目录一、背景与需求二、技术选型与原理1. 加密方案对比2. 核心算法选择三、完整代码实现1. 加密上