一、什么是时间轮算法?
时间轮算法是一种用于处理定时任务和调度的常用算法。
时间轮算法的组成有:
- 时间轮
- 时间槽:一个时间轮对应多个时间槽,时间槽还可以分为秒级时间槽、分钟级时间槽、小时级时间槽等
二、时间轮算法怎么实现?
如下图所示,一个时间轮分为了60个时间槽,可以用来代表秒级时间槽、分钟级时间槽等
任务怎么放在时间轮上呢?:任务会按照对应的时间段放在对应的时间槽中,如果对应的时间槽中已经有其他任务存在,则添加到该时间槽上对应链表尾部(大概思想类似HashMap的数组+链表)
举个例子,有个任务要在第3秒执行,那么就对应下图所示的链表
那么时间轮是怎么运转的呢?:时间轮跟我们印象中的时钟一样,就是按照顺序遍历,如秒级时间轮每移动一个时间槽就是过了一秒,如下图所示current指针就是目前我们处于的秒数
那么我们如何在秒级时间轮上表示第200秒的任务呢?:首先我们是不可能拆分成200个时间槽的,因为一分钟固定只有60秒,所以我们可以用round表示已经走过的圈数(即分钟数),当我们要表示200秒时对应的current=200/60=3,对应的秒数为200%60=20,如下表所示我们初始的round=3,当走完一圈round就减一,当round=0、current=20时则说明200秒到了,可以执行对应的任务了
如果要在几小时后几天后执行一个定时任务只使用秒级时间轮会导致链表太长怎么办?:所以我们要进行时间轮的分层,即分为秒级时间轮、分钟级时间轮、小时级时间轮等,当我们要执行200秒时,可以先把任务房在current=3的分钟级时间轮上,等命中后发现还有20秒,那么就转移到current=20的秒级时间轮上,最后等秒级时间轮上命中即可
三、总结
- 时间轮算法用在处理定时任务和调度上
- 时间轮分为多层,如秒级时间轮、分钟级时间轮、小时级时间轮等
- current指针指向当前时间对应的时间槽,round表示当前剩余圈数(当为0时命中就可以取出执行了)
- 常用框架:xxl-job