延时任务-订单超时取消实现
程序员文章站
2022-07-04 18:39:33
...
1.定时任务JOB
定时任务扫描数据库 ,不详述了。
优点:简单易行,支持集群操作
缺点:(1)对服务器内存消耗大。
(2)存在延迟,比如你每隔3分钟扫描一次,那最坏的延迟时间就是3分钟。
(3)数据量大时数据库损耗极大。
2.JDK的延迟队列DelayedQueue
优点:效率高,任务触发时间延迟低。
缺点:(1)服务器重启后,数据全部消失,怕宕机
(2)集群扩展相当麻烦
(3)因为内存条件限制的原因,比如下单未付款的订单数太多,那么很容易就出现OOM异常
(4)代码复杂度较高
(5)时间轮算法
3.redis缓存
使用 redis sorted set
利用redis的zset,zset是一个有序集合,每一个元素(member)都关联了一个score,通过score排序来取集合中的值
添加元素:ZADD key score member [[score member] [score member] …]
按顺序查询元素:ZRANGE key start stop [WITHSCORES]
查询元素score:ZSCORE key member
移除元素:ZREM key member [member …]
优点:(1)由于使用Redis作为消息通道,消息都存储在Redis中。如果发送程序或者任务处理程序挂了,重启之后,还有重新处理数据的可能性。
(2)做集群扩展相当方便
(3)时间准确度高
缺点:(1)部署redis花费
定时任务扫描数据库 ,不详述了。
优点:简单易行,支持集群操作
缺点:(1)对服务器内存消耗大。
(2)存在延迟,比如你每隔3分钟扫描一次,那最坏的延迟时间就是3分钟。
(3)数据量大时数据库损耗极大。
2.JDK的延迟队列DelayedQueue
优点:效率高,任务触发时间延迟低。
缺点:(1)服务器重启后,数据全部消失,怕宕机
(2)集群扩展相当麻烦
(3)因为内存条件限制的原因,比如下单未付款的订单数太多,那么很容易就出现OOM异常
(4)代码复杂度较高
(5)时间轮算法
3.redis缓存
使用 redis sorted set
利用redis的zset,zset是一个有序集合,每一个元素(member)都关联了一个score,通过score排序来取集合中的值
添加元素:ZADD key score member [[score member] [score member] …]
按顺序查询元素:ZRANGE key start stop [WITHSCORES]
查询元素score:ZSCORE key member
移除元素:ZREM key member [member …]
优点:(1)由于使用Redis作为消息通道,消息都存储在Redis中。如果发送程序或者任务处理程序挂了,重启之后,还有重新处理数据的可能性。
(2)做集群扩展相当方便
(3)时间准确度高
缺点:(1)部署redis花费