我有一个简单的webapp项目,用户可以在其中输入搜索字词并返回结果。我想在内存中缓存最后n = 10个结果(它的FIFO)来优化它,但不知道最好的方法。
我认为由于他们的O(1)搜索,哈希映射会是最好的,但是 (同步)例如,当你想存储第11个查询时,Hashmap不能检查哪个是要替换的第一个添加的键; 和LinkedHashmap&队列没有很好的快速.contains()方法。
缓冲最后n个的好方法导致java?
答案 0 :(得分:3)
似乎你需要一个LRU缓存,它可以很容易地在LinkedHashMap之上实现。复制自here:
import java.util.LinkedHashMap;
import java.util.Map;
public LRUCache<K, V> extends LinkedHashMap<K, V> {
private int cacheSize;
public LRUCache(int cacheSize) {
super(16, 0.75, true);
this.cacheSize = cacheSize;
}
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() >= cacheSize;
}
}
只需使用cacheSize = 10
对其进行实例化以适合您的用例。至于contains()
中的LinkedHashMap
,O(1)
does it。
答案 1 :(得分:2)
您可以简单地使用Guava cache(它是线程安全的!):
LoadingCache<Key, Value> cache = CacheBuilder.newBuilder()
.maximumSize(n) // n = 10 ?
.build(
new CacheLoader<Key, Value>() {
public Value load(Key key) throws AnyException {
return getValue(key);
}
});