在上篇中提了定时器的两种实现的思路,同时也提到了一个问题,就是当一个进程需要使用大量定时器时,需要利用时间轮、最小堆或红黑树等结构来管理定时器。为什么要这样呢?我们先回顾下上篇的观点,上篇中提到定时器比较常见的有两种,一种是cron like,另外一种是周期性执行的定时器,但是对于cron like的定时器而言,如果要性能好,一般要每个定时器一个线程,或者是要借用另外一个周期执行的定时器来做触发源,用一个数据结构,如链表,把所有cron like的定时器串起来,然后在每个周期,如1秒一次,去扫描这个链表,去判断是否有定时器能够被触发。这种做法在定时器比较少时固然问题不大,但是如果定时器多起来的话,整个过程的性能就不那么的好了,所以,我们需要有一个比较链表更好的数据结构来管理我们的定时器。对于定时器管理这个场景中,用链表的查找慢的原因主要是因为定时器在链表中是无序保存的,所以只能够遍历整个链表,那要改进的话,就必须解决一个问题,就是怎样把这些定时器变得有序。这个问题最简单的解法,就是预先计算出这些定时下次被触发的时间点,然后根据这个时间点由小到大排序就行了,但是如果还是沿用链表,每个有节点要增加或者移除,性能都不会太好,所以,我们必须引入更好的数据结构来管理这些定时器。下面说下笔者认为比较常见的思路吧。
1、红黑树
对于改进链表的查找性能,最直接也是最常见的思路,就是使用二分搜索树。但是由于定时器执行的时间点是一直在变化的,也就是说,如果这棵二分查找树的根节点不变的情况下,二分查找树会变得很不平衡,因此,使用能够自动调节