我有一个简单的webapp项目,用户可以输入搜索条件并返回结果。我想将最后n = 10个结果缓存在内存中(它是FIFO)来优化它,但不知道最好的方法。缓存最后n个查询结果的最有效方法?
我以为hashmaps是最好的,因为他们的O(1)搜索,但 (同步)哈希映射无法检查哪个是第一个添加的键被替换,当你想存储第11个查询例如; 和LinkedHashmap &队列没有很好的快速.contains()方法。
任何好的方法来缓冲最后n导致在Java?
我有一个简单的webapp项目,用户可以输入搜索条件并返回结果。我想将最后n = 10个结果缓存在内存中(它是FIFO)来优化它,但不知道最好的方法。缓存最后n个查询结果的最有效方法?
我以为hashmaps是最好的,因为他们的O(1)搜索,但 (同步)哈希映射无法检查哪个是第一个添加的键被替换,当你想存储第11个查询例如; 和LinkedHashmap &队列没有很好的快速.contains()方法。
任何好的方法来缓冲最后n导致在Java?
看来你需要一个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
实例化,以适合你的使用情况。至于,LinkedHashMap
does it在O(1)
。
请注意,此实现不是线程安全的,因此可能不是Web应用程序的好解决方案。 –
您可以简单地用一个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);
}
});
当你说'LinkedHashmap'没有快速的'.contains()'方法时,你是什么意思?它具有与'HashMap'相同的性能特征。 –