延时队列的作用以及设计思路

目录

延迟队列的应用

如何构建延时队列

方案一:

方案二:

方案三:


延迟队列的应用

延迟队列在项目中应用有很多,尤其是像电商平台:

1、订单成功后,在三十分钟内没有支付,自动取消订单

2、外卖平台发送订餐通知,下单成功后60s给用户推送短信

3、如果订单一直处于某一个未完结状态时,及时处理关掉,并退还库存

4、淘宝新建商户一个月之内还没有上传商品信息,将冻结商铺等

。。。。

上面的情况都可以用到延时队列解决

如何构建延时队列

方案一:

底层用一个PriorityQueue优先队列(小顶堆)实现,将所有需要的的任务存在队列中,根据时间排序,延时时间短的先被消费者进行消费执行,while循环判断是否时间用完了,如果用完了就poll掉执行,然后继续轮询其他的任务

优点:使用成熟的数据结构,时间复杂度低,使用堆排序实现,稳定而且响应时间短

缺点;while循环在没有被执行的时候就会一直轮询,对cpu性能消耗较大

方案二:

通过date类来获取当前时间,截取小时和分钟判断是否相等于20:00 ,等于之后执行下单操作,加锁,防止多次执行,之后不让它结束,这个线程进入sleep状态,休眠1800s,支付操作完成后结束sleep状态,让线程结束,从队列当中取出这个值,未支付的haul睡醒之后也取出这个值

缺点:消耗cpu,任务多的话,系统崩溃

优点:设计简单,不用考虑时间问题

方案三:

以任务的过期时间为score,存入zset,设置定时任务的时间假如为1s,两种情况:

1:获取到的score

2:获取的score>当前时间,说明zset中该任务以及后面的所有任务都还没有到执行的时间,则休眠一秒后继续查询。

优点:zset也是成熟的结构,实现简单,redis中适量的加分布式锁之后,可以解决线程安全,基于内存,速度快。

缺点:还是需要去轮询任务,会造成不必要的cpu浪费

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ADRU

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值