缓存最后n个查询结果的最有效方法?

时间:2016-08-12 17:19:15

标签: java hashmap

我有一个简单的webapp项目,用户可以在其中输入搜索字词并返回结果。我想在内存中缓存最后n = 10个结果(它的FIFO)来优化它,但不知道最好的方法。

我认为由于他们的O(1)搜索,哈希映射会是最好的,但是 (同步)例如,当你想存储第11个查询时,Hashmap不能检查哪个是要替换的第一个添加的键; 和LinkedHashmap&队列没有很好的快速.contains()方法。

缓冲最后n个的好方法导致java?

2 个答案:

答案 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()中的LinkedHashMapO(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);
       }
     });