Erd*_*kın 3 java algorithm timeout hashtable
我有一个哈希表,在流量很大的情况下.我想为哈希表添加超时机制,删除太旧的记录.我担心的是, - 它应该是轻量级的 - 删除操作没有时间关键.我的意思是(超时值是1小时)删除操作可以在1小时或1小时15分钟后.没有问题.
我的意见是,我创建了一个大数组(作为环形缓冲区),存储时间和哈希表键,当添加到哈希表时,使用数组索引查找数组上的下一个插槽时间,如果数组插槽为空,则插入时间和HT键,如果数组槽不为空,则比较发生超时的插入时间.
如果发生超时从Hashtable中删除(如果尚未删除)则不会发生超时,增加索引直到找到空槽或时间数组槽.从哈希表中删除时,大数组上没有操作.
不久,对于Hashtable的每个添加操作,可以从哈希表中删除1个timeouted元素或不执行任何操作.
您的优雅和轻量级解决方案是什么?
谢谢你的帮助,
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);
}
});
Run Code Online (Sandbox Code Playgroud)
这可能不是正是你所描述的东西,但机会是足够接近.而且它更容易生产(加上它使用经过充分测试的代码库).
请注意,您可以Map
通过在调用之前调用不同的方法来调整结果的行为make*()
.
你应该考虑使用a LinkedHashMap
或者a WeakHashMap
.
前者有一个构造函数,用于将元素的迭代顺序设置为上次访问的顺序; 这使删除太旧的元素变得微不足道.并且removeEldestEntry
可以重写其方法以定义自己的策略,以便在插入新条目后自动删除最长条目.
后者使用对密钥的弱引用,因此任何没有其他引用的密钥都可以自动进行垃圾回收.