1。30分钟内未付款,订单将自动取消。2.30分钟内无回复,会议结束。对于上面的任务,我们给一个专业的名字来形容,那就是延迟任务一什么是延迟任务?延迟任务不同于常规计划任务。延迟任务是在事件触发后的未来某个时间执行,没有重复执行周期。2.延迟任务和定时任务有什么区别?定时任务有明确的触发时间。延迟任务没有定时任务就没有执行周期。延迟任务在事件触发后的一段时间内执行。没有执行周期的常规任务一般是多个任务分批执行,而延时任务一般是单任务处理。3、技术对比本文主要讲解Redis实现延迟任务的Zset实现。其他解决方案仅作介绍。1.数据库轮询通过定时组件扫描数据库,使用时间判断是否有超时命令,然后进行更新或删除等操作。优点:简单易行缺点:服务器内存消耗大,时间间隔小,数据库数据内存状态丢失巨大,不可靠如果任务负载过大,给数据库造成很大压力。频繁查询数据库带来性能影响2.JDK的延迟队列是使用JDK自带的DelayQueue实现的。这是一个无界阻塞队列。队列只有在延迟期满时才能从中获取元素,需要将其放入DelayQueue中。实现延迟接口。优点:实现简单,效率高,任务触发延时小。缺点:服务器重启后,所有数据都会消失。怕内存条件限制导致宕机。比如没有付款的订单太多,很容易出现OOM异常的数据内存状态,不可靠。3、时间轮算法时间TimingWheel是一种高效低延迟的调度数据结构。底层使用数组实现一个循环队列,用于存储任务列表。原理图如下:时间轮时间轮算法可以类比为时钟,如上图所示。频率旋转,每跳动一次,称为一次跳动。可以看出,计时轮由3个重要的属性组成,ticksPerWheel(一个回合的tick数)、tickDuration(一个tick的持续时间)和timeUnit(时间单位),例如当ticksPerWheel=60时,tickDuration=1,timeUnit=second,这就完全类似于现实中秒针不停的走动。如果当前指针指向1,我有一个任务需要在4秒后执行,那么执行线程回调或者消息会放在5。常用命令ZADD命令:向有序集中添加一个或多个成员元素及其分值,或更新已有成员的分值ZCARD命令:获取有序集的成员个数ZRANGEBYSCORE:返回指定区间的orderedsetbyscoreMembersinZREM:删除有序集中的一个或多个成员。java中操作简介1.add(Kkey,Vvalue,doublescore)给一个变量添加一个元素,同时指定该元素的分数。redisTemplate.opsForZSet().add("zSetValue","A",1);2.rangeByScore(Kkey,doublemin,doublemax)根据设定的分数得到区间值。zSetValue=redisTemplate.opsForZSet().rangeByScore("zSetValue",1,2);3.rangeByScore(Kkey,doublemin,doublemax,longoffset,longcount)根据设置的score和给定的长度,从给定的下标中获取区间值,得到最终值。zSetValue=redisTemplate.opsForZSet().rangeByScore("zSetValue",1,5,1,3);4.rangeWithScores(Kkey,longstart,longend)获取RedisZSetCommands.Tuples的区间值。Set>typedTupleSet=redisTemplate.opsForZSet().rangeWithScores("typedTupleSet",1,3);Iterator>iterator=typedTupleSet.iterator();while(iterator.hasNext()){ZSetOperations.TypedTuple