1

所以我有一张来自 Key -> Struct 的地图

我的键将是一个设备 IP 地址,而 Value(Struct) 将保存一个设备 IP 地址,并且经过一段时间后,键值对将过期并从地图中删除。

我对此很陌生,所以想知道什么是一个好方法。

我用谷歌搜索了一下,似乎只在 Java 中找到了很多基于时间的地图

编辑

遇到这个之后,我想我可能必须创建一个包含项目的地图,然后有一个与每个元素的引用并行的双端队列。然后定期调用 clean ,如果它在那里的时间超过 x 时间,请删除它。

这是校正器吗?任何人都可以提出一种更优化的方法吗?

4

1 回答 1

1

我使用了三种方法来解决这样的问题。

  1. 使用定期计时器。每次量子,获取所有过期元素并使其过期。将元素保留在计时器轮中,有关想法,请参见本文中的方案 7。这里的开销是周期性计时器将在它无事可做并且存储桶具有恒定的内存开销时启动,但如果您从地图中添加和删除事物的频率远高于过期时间,这是您可以做的最有效的事情它的元素。

  2. 检查所有元素的最短到期时间。安排一个计时器在该时间后启动。在计时器中,移除过期元素并安排下一个计时器。如果新元素的过期时间短于当前调度的计时器,则每次添加新元素时重新调度计时器。将元素放在堆中,以便快速查找谁需要先过期。这有相当大的插入和删除开销,但是当从映射中最常见的删除是通过过期时,它非常有效。

  3. 每次访问地图时,请检查您访问的元素是否已过期。如果是,就把它扔掉,假装它一开始就不存在。这可能是非常低效的,因为所有调用都需要检查每次访问的时间戳,并且如果您需要在到期时执行一些操作则不起作用。

于 2013-07-22T09:22:45.993 回答