.. | ||
readme.md |
红黑树实现定时器
source: https://mp.weixin.qq.com/s/9VTINJ_rMOmElQUnIuD_7Q
R-B Tree 简介
R-B Tree,是Red Black Tree的缩写,也叫做红黑树。红黑树是一种带有颜色属性(红色或黑色)的自平衡的二叉查找树。它查找、插入和删除的时间复杂度为log(N),N为树中元素的数目.
红黑树的实现较为复杂,有对红黑树的实现感兴趣的,可以自己研究,nginx的红黑树很值得一读,nginx红黑树的代码在src/core/中,为ngx_rbtree.h和ngx_rbtree.c。红黑树使用还是很广泛的,比如c++ STL中的map以及set底层的实现使用的都是红黑树。
红黑树定时容器的实现
定时器的实现可以使用多种数据结构,比如:最小堆,libevent中的定时器使用的就是最小堆;红黑树,nginx的定时器使用红黑树来实现;以及时间轮等。下面介绍的定时容器的实现使用nginx中的红黑树实现代码。
该定时器容器的思路是:将所有定时器中超时时间最小的一个定时器的超时值作为心搏间隔,这样,一旦心搏函数tick被调用,超时时间最小的定时器必然到期,我们就可以在tick函数中处理该定时器。然后,再从剩余的定时器中找到超时时间最小的一个,并将这段最小时间设置为下一次心搏间隔,如此反复,就实现了较为精确的定时。
红黑树定时容器的几个接口介绍:
- tick :在tick函数中循环查找超时值最小的定时器,并调用其回调函数,直到找到的定时器的没有超时,就结束循环。
- addTimer::向容器中添加一个定时器,并返回定时器的指针。
- delTimer::根据传入的定时器指针删除容器中的一个定时器,并且销毁资源。
- resetTimer: 重置一个定时器。
- getMinExpire:获取容器中超时值最小的绝对时间;