【Java】订单超时,如何自动取消

订单超时未支付,如何自动关闭

扫表轮循

扫表轮循

这是最简单的一个方案,实现的方式:开一个定时任务,去扫描订单表,获取待支付状态的一些数据,然后把超时的数据,进行批量修改状态。

优点:实现简单
缺点:如果数据量大,查询和修改的压力很大,对于服务器的内存消耗也很大,IO也可能成为系统瓶颈,并且不太好控制,随着定时任务的增多和细化,可能会出现重复扫描的情况。
推荐:项目比较小的时候。

懒删除

懒删除
当用户去查询他自己订单的时候,顺便去查询订单是否超时,如果超时,就把当前订单直接关闭。

优点:实现简单,对业务本身的影响较小,再查询的时候,通过异步的方式去处理订单校验,对查询的性能没有影响。
缺点:如果用户一直没有触发订单查询的操作,订单会被一直挂起,既没有支付,也没有取消,但是占了库存。
推荐:可以接受延时处理的业务

消息队列实现

消息队列实现
利用消息队列中的延迟队列实现,每次下单的时候往延迟队列中存放,然后设置一个过期时间,当消息达到了设置的过期时间,这个消息才会投递给消费者。

优点:可以从队列里面去移除我们需要实时取消的一些订单,及时的把库存资源腾出来,消息存在MQ中不会占用应用服务器的资源,可以实现异步的处理,并且扩容方便
缺点:使用了MQ组件,提高了架构的复杂度
推荐:数据量大,业务复杂度高

Redis实现

Redis实现
通过Redis中过期监听机制,在配置文件中开启,开启这个机制后,客户端可以做一个监听回调,然后再去处理关闭订单的一个业务逻辑

优点:应用服务器和Redis是分离的,应用的宕机不会对Redis产生影响,集群的扩展也很方便,Redis超时级制的时间准确性也比较高,Redis在现在后端开发框架中更常用,不需要额外引入MQ。
缺点:如果订单量过大,对内存的占用比较高
推荐:架构本身使用的Redis,并且数量不大

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值