2016-08-12 5 views
0

私は、ユーザーが検索語を入力して結果が返される簡単なwebappプロジェクトを持っています。私は最後のn = 10の結果をメモリにキャッシュすることを考えました(それはFIFOです)。最適化するには最適な方法がわかりません。最後のn個のクエリ結果をキャッシュする最も効率的な方法は?

O(1)検索のためにハッシュマップが最適だと思っていましたが、 (synchronized)ハッシュマップでは、例えば11番目のクエリを保存するときに、 とLinkedHashmap &キューにはすぐれた.contains()メソッドがありません。

最終nをバッファリングする良い方法は、Javaの結果ですか?

+1

'LinkedHashmap'に速い' .contains() 'メソッドがないとはどういう意味ですか? 'HashMap'と同じ性能特性を持ちます。 –

答えて

3

あなたが簡単のLinkedHashMapの上に実装することができLRUキャッシュを、必要と思われます。 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); 
     } 
    }); 
関連する問題