用于存储条目的数据结构,其时间戳按排序顺序

时间:2016-07-28 12:33:36

标签: java multithreading collections

我必须实现一个场景,我需要在其中存储大量带有时间戳的条目,例如“AnyString”和“Timestamp”。现在,我必须定期检查那些计时器即将到期的条目(假设条目将过期,其时间戳超过一个小时)。因此,为了保持它们的存活,我必须过滤掉计时器将在一段时间内过期的条目并执行一些操作并重新初始化它们的时间戳。它是多线程环境。

为了做到这一点,我正在寻找有效的数据结构,这样当我扫描地图以找出哪个计时器将要过期时,我不必遍历整个地图。要遍历完整的地图,每次过滤掉即将到期的条目都会产生巨大的性能影响。

我想使用“ConcurrentSkipListMap”,其中Comparator可用于按时间戳的排序顺序存储条目。因此,每次我扫描地图,直到时间戳大于所需值的netires。

有没有更好的方法来完成这项任务? 感谢。

1 个答案:

答案 0 :(得分:1)

<强>短: 我建议你研究一下http://netty.io/4.0/api/io/netty/util/HashedWheelTimer.html - 它能做你想做的事。

<强>长:

为此目的有一种特殊的结构:定时轮。 Here

简而言之,这个想法如下:你有一个大圆形数组,这个数组的每个元素都是你的对象列表。你还有一个指针指向数组的某个元素,并在每个tick上递增。每个元素都有相关的时间范围,这些时间范围是以特殊方式选择的。例如。整轮轮流为1s,阵列有1000个元素,然后: 第0个元素是事件列表,应该在x.000 - x.001s触发, 第一个元素是一个事件列表,应该在x.001 - x.002s等时触发。

当您添加新事件时,您应该获得提醒time_when_the_event_should_fire / wheel_period,这样就可以确定您应该添加此事件的数组元素。

每个刻度线(1毫秒)指针将增加1,元素是有序列表 - 所以在每个刻度线上你取元素(列表),遍历列表项,如果事件应在此刻度处触发,你解雇它,否则停止迭代。

因此,您将在所有操作中获得O(1),并在添加新事件时获得O(n / wheel_size)。