Netty-HashedWheelTimer-源码学习
未完待续 引入: 详解了时间轮的用法: https://www.zhihu.com/question/361018720/answer/937510941 时间轮的来由【10w定时任务,如何高效触发超时】: https://blog.csdn.net/qijiqiguai/article/details/78606877 1. 为啥需要它? 需求:最近要搞IM,里面有个需求,15秒不发消息,判断用户下线。 经过探讨总共得到两种方法: 对个每个用户开启一个定时器,15秒后启动它,并判断用户是否下线。 很显然,这不现实,每个定时器都需要一个线程 将每个用户最后的请求时间戳缓存下来,然后开启一个定时器,轮询每个用户,判断其是否超时。 仅启动一个定时器,非常nice,但是问题是需要轮询每个用户,也许应该用多个定时器来处理,但是这都无法改变一个问题,需要轮询大量无关用户,有没有办法解决这个问题? 这个两个方法引出了核心需求: 我希望定时器每次启动都只对需要操作的对象操作。即对可能已经失效的用户来操作。 这个需求的核心问题在于 按照时间对任务排序 。 那为什么要用所谓的时间轮结构?普通队列它不香吗?或者说HashedWheelTimer和java.util.Timer的差别在哪里? 1. 从性能上考虑,(主要体现在插入任务的过程) : 明显HashedWheelTimer占优。