2016-08-12 93 views
0

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

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

任何好的方法来缓冲最后n导致在Java?

+1

当你说'LinkedHashmap'没有快速的'.contains()'方法时,你是什么意思?它具有与'HashMap'相同的性能特征。 –

回答

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实例化,以适合你的使用情况。至于,LinkedHashMapdoes itO(1)

+1

请注意,此实现不是线程安全的,因此可能不是Web应用程序的好解决方案。 –

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); 
     } 
    });