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

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

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

相关文章

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码