1、为每个连接设置定时器
每次心跳,将定时器清零。定时触发,认为此连接失活。
2、为每个连接维护最新时间戳
每次心跳,记录连接的时间戳
每隔1分钟,遍历所有时间戳,用当前时间减去时间戳,大于1分钟,认为此连接失活。
以上两种方法都会消耗大量资源,尤其是高并发场景下,上千万级别连接检测非常耗时。
3、时间轮
用一个循环队列,队列每个元素都是队列。
每隔1秒,指针移动到下一个链表头。
每次连接发心跳,都把连接fd放到1分钟之后的槽位,当指针移动到这个槽位,认为连接失活。
但是每次连接发心跳,都需要维护fd在时间轮中的槽位位置。