相信很多同学和我一样第一次看到这个名词,这个结构通俗的讲就是一个环形队列,专门设计用来处理大量定时任务的结构。
先看一张结构图
原理介绍
为了理解,我们假设业务:用户无操作时,8s即离线处理
如图,该环形队列有8个槽位,每个槽位有index值,定时任务设置为每1s顺时针走1格,聪明的你肯定想到了,我们可以把大量的定时任务通过一套算法落地到每一个槽位,这样当定时任务走到对应槽位时只需要获取该槽位所有的任务去处理即可
-
8s超时,就创建一个index从1到8的环形队列(本质是个数组)
-
环上每一个槽位是一个数组(存储uid)
-
定义一个数组,记录uid落在环形队列的哪个槽位里
-
启动一个定时器,每隔1s,在上述环形队列中移动一格
-
定义一个index指针来标识刚检测过的槽的位置
用户请求到达时
-
从数组中,查找出这个uid存储在哪一个槽里
-
从这个槽的集合中,删除这个uid
-
将uid重新加入到新的槽集合中(具体是哪一个槽呢 ,Index指针所指向的上一个槽位,因为这个槽位,会被定时器在10s之后扫描到)
-
更新数组,记录这个uid对应槽的值
-
离线操作,定时器每秒种移动一个槽位,这个槽对应的集合中所有uid都应该被集体超时
优点
只需要1个定时器
定时器每1s只需要一次触发,消耗CPU很低
批量超时,当前扫到的槽位集合中所有元素都应该被离线