CodeFree/6_solution/高性能定时器/红黑树定时器/readme.md

23 lines
1.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 红黑树实现定时器
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获取容器中超时值最小的绝对时间