Hashtable的超时机制

时间:2011-01-18 12:59:35

标签: java algorithm timeout hashtable

我有一个哈希表,在流量很大的情况下。我想为哈希表添加超时机制,删除太旧的记录。我担心的是, - 它应该是轻量级的 - 删除操作没有时间关键。我的意思是(超时值是1小时)删除操作可以在1小时或1小时15分钟后。没有问题。

我的意见是, 我创建了一个存储时间和哈希表键的大数组(作为环形缓冲区), 添加到哈希表时,使用数组索引查找数组上的下一个插槽时间,   如果数组插槽为空,则插入插入时间和HT键,   如果数组槽不为空,则比较发生超时的插入时间      如果发生超时从Hashtable中删除(如果尚未删除)      它没有超时发生,增加索引直到找到空槽或定时阵列槽。 从哈希表中删除时,大数组上没有操作。

很快,对于Hashtable的每个添加操作,可以从哈希表中删除1个timeouted元素或什么也不做。

您的优雅和轻量级解决方案是什么?

感谢您的帮助,

4 个答案:

答案 0 :(得分:9)

我的方法是使用Guava MapMaker

ConcurrentMap<String, MyValue> graphs = new MapMaker()
   .maximumSize(100)
   .expireAfterWrite(1, TimeUnit.HOURS)
   .makeComputingMap(
       new Function<String, MyValue>() {
         public MyValue apply(String string) {
           return calculateMyValue(string);
         }
       });

这可能不是完全您所描述的内容,但它可能足够接近。而且它更容易制作(加上它使用经过充分测试的代码库)。

请注意,您可以在调用Map之前调用不同的方法来调整结果make*()的行为。

答案 1 :(得分:5)

您应该考虑使用LinkedHashMapWeakHashMap

前者有a constructor将其元素的迭代顺序设置为上次访问的顺序;这使删除太旧的元素变得微不足道。并且可以重写其removeEldestEntry方法,以定义自己的关于何时在插入新条目后自动删除最旧条目的策略。

后者使用对密钥的弱引用,因此任何没有其他引用的密钥都可以自动进行垃圾回收。

答案 2 :(得分:0)

我认为更简单的解决方案是使用Apache Commons Collections中的LRUMap。当然,如果您喜欢或想要学习,您可以编写自己的数据结构,但这个问题非常普遍,因此存在大量现成的解决方案。 (我相信其他人也会指出你的其他实现,经过一段时间你的问题将从他们中选择正确的一个:))

答案 3 :(得分:0)

假设当前缓存结构中当前访问量最大的项目占很大比例,您可能会随机选择要删除的项目(删除非常有用的内容的可能性很小)。我已经使用了这种技术,在这个特定的应用程序中,它运行得非常好,并且接下来没有实施工作。