倒计时实现的几种方式

倒计时实现的几种方式
序:
先说说使用场景,这次的项目是有点偏向电商的,但是能又没有使用蛮多电商目前火的框架。扯远了,就说订单的倒计时吧,因为不能长时间占用出售人的资源,规定时间不付款就需要取消订单,就跟12306买票一样,45分钟不付款票就可以重新出售。
页面上的肯定是使用setTimeOut,主要就是说说后台的设计
1.使用java自带的Timer (这个的性能肯定是不够的,quartz都比这个强)
Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { midTime -= 设定循环执行时间 ; long hh = midTime / 60 / 60 % 60; long mm = midTime / 60 % 60; long ss = midTime % 60; //查询15分钟前订单,处理业务 } }, 0, 设定循环执行时间);
2.使用quartz定时器
思路跟timer其实差不多,也是每隔多长时间查询一次15分钟前的订单,写业务逻辑,更改订单状态等等
3.使用DelayQueue延期队列 + redis
我习惯叫死亡队列,就是等死的队列,呵呵。这个项目一旦重启队列就不存在了,所以一般还配合redis,web服务器启动以后,从redis中读取待付款的订单,插入到DelayQueue,逻辑继续,继续等死。
实现Delayed接口就是实现两个方法即compareTo 和 getDelay最重要的就是getDelay方法,这个方法用来判断是否到期,这里在订单超时死亡的时候写我们直接的业务逻辑。
这里有个比较详细的例子:
4.基于redis,实现redis超时失效key 的监听触发
写一个监听,继承redis的JedisPubSub。
这里需要注意:jedis的subcribe操作是阻塞的,所以我们另起了一个线程来进行subcribe操作,里面写我们的逻辑。
以上方式的优劣:
1.性能消耗大,数据量大了吃不消
2.目前来说还比较靠谱,就是担心quartz是单独一个项目,与业务系统在事务上可能出现管理不一致,并发大了导致数据紊乱。
3.项目不能重启,重启队列就空了,还好有redis作为补偿
4.redis不做集群,怕redis吃不消。
以上分析也是自己的拙见,可能现在电商有很多更好的方式处理。技术不能止步,加油,说给自己。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥仔哥哥1930

来一波支持,吃不了亏上不了当

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值