时间轮

作者: 越狱的灵感 | 来源:发表于2022-06-08 09:45 被阅读0次

前言

时间轮是一个非常高效且低成本的计时算法,论文地址《Hashed and Hierarchical Timing Wheels》,Linux 内核中使用广泛,你所用到的crontab就是如此,相对于DelayQueue的O(logN),HashedWheelTimer 的时间复杂度是 O(1)。有广泛的使用,比如在netty,kafka,Dubbo,Redisson等著名框架中。

使用场景

1,定时任务
2,超时处理
3,心跳检测
4,锁超时释放
等等...

原理

[图片上传中...(2.png-9377fa-1654501129086-0)] 2.png

1,HashedWheelTimer 的时间精度并不高,误差在 100ms 左右,任务队列等待任务数量过多的情况下可能会积累出相应的误差。
2,HashedWheelTimer 能够处理非常大量的定时任务,且每次定位到要处理任务的候选集合链表只需要指针指向下一个桶即可,时间复杂度为O(1) ,而 Timer 等则需要调整堆,是 O(logN) 的时间复杂度。
3,HashedWheelTimer 实际上是将一个大的任务拆成多个小的任务,放到时间盘上。这样可以减少大量的CPU,线程,内存资源消耗。
5,HashedWheelTimer 单时间盘,无法满足的情况下,可以使用多时间盘,每个时间盘代表不同的时间单位

主要实现

实现的话主要理解Netty的HashedWheelTimer算法。主要有4个类。Timer,TimerTask,Timeout,HashedWheelTimer。

三个接口
Timer:管理 TimerTask,HashedWheelTimer 也是实现了 Timer 接口
TimerTask:通过上述的 Timer.newTimeout(TimerTask, long, TimeUnit) 加入,在指定时间后执行的 Task
Timeout:持有上层的 Timer 实例,和下层的 TimerTask 实例,然后取消任务的操作也在这里面
三者的关系


3.png

一个实现

HashedWheelTimer:时间轮算法具体实现。

java代码使用:

HashedWheelTimer wheelTimer = new HashedWheelTimer();
wheelTimer.newTimeout(timeout -> System.out.println("1s delay"), 1, TimeUnit.SECONDS);
wheelTimer.newTimeout(timeout -> System.out.println("10s delay"), 10, TimeUnit.SECONDS);
wheelTimer.newTimeout(timeout -> System.out.println("11s delay"), 11, TimeUnit.SECONDS);
TimeUnit.SECONDS.sleep(20);

注意:netty使用时间轮算法的情况下,能够处理上百万的连接。不过一般都是处理一些短快的任务比如心跳。而且netty的实现只支持单轮。

相关文章

  • 时间轮

    参考代码 hzlulu/TimingWheel TimerTask 时间轮中任务类的抽象类。实现Runnable...

  • 时间轮

    https://zhuanlan.zhihu.com/p/102476356[https://zhuanlan.z...

  • 时间轮

    前言 时间轮是一个非常高效且低成本的计时算法,论文地址《Hashed and Hierarchical Timin...

  • 浅论时间轮

    基于时间轮的定时器 定时器的实现多采用最小堆,其创建和删除复杂度为O(logN),tick的复杂度为O(1);在极...

  • 时间之轮

    八点起床,手机没你的消息。在忙吧,反正也无话可说。我过我的生活,你享受你的人生,做你想做的事情,我们一点交集都没有...

  • 时间的轮

    时间的轮 碾碎了咆哮的嘴的牙 撕开了涨鼓的胸口的皮肉 风再吹进来 给赤裸的颤栗的心 去降温 去涂抹冷色调的漆 去掩...

  • kafka时间轮

    举个例子:第一层时间轮格数是10,每格表示1ms。第二层时间轮格数是20,每格表示上一层时间轮的总和:10*1ms...

  • 关于时间轮

    最近翻看了去哪儿的QMQ的关于延时队列的源码,主要就是想要了解它在延时队列上实现的设计方案。 1、延时消息投递到d...

  • 时间之轮

    《地球编年史》系列第五本,“当时间开始”,主要讲述的是“时间”这个概念在地球上出现的缘由、时间,“时间”又是如何被...

  • 时间轮足

    1后桌的故事 我一直搞不懂,小俊和我前后桌一年了,我们的关系也只是前后桌,而小艳才换过来挨着小俊坐了...

网友评论

      本文标题:时间轮

      本文链接:https://www.haomeiwen.com/subject/tuyjmrtx.html