2016-08-12 2 views
0

Ich habe ein einfaches Webapp-Projekt, in dem Benutzer Suchbegriffe eingeben können und Ergebnisse zurückgegeben werden. Ich dachte, die letzten n = 10 Ergebnisse im Speicher zu speichern (es ist FIFO), um es zu optimieren, aber ich weiß nicht den besten Weg, das zu tun.Die effizienteste Möglichkeit, die letzten n Abfrageergebnisse zwischenzuspeichern?

Ich dachte Hashmaps die beste aufgrund ihrer O wäre (1) Suche, aber (synchronisiert) HashMap kann nicht überprüfen, welche der erste addierte Schlüssel war ersetzt werden, wenn Sie die 11. Abfrage beispielsweise gespeichert werden sollen; und LinkedHashmap & Warteschlangen haben keine gute schnelle .contains() -Methode.

Jeder gute Weg, letzte n Ergebnisse in Java zu puffern?

+1

Was meinst du, wenn du sagst, 'LinkedHashmap' hat keine schnelle' .contains() 'Methode? Es hat die gleichen Leistungsmerkmale wie 'HashMap'. –

Antwort

3

Es scheint, dass Sie einen LRU-Cache benötigen, die sich leicht auf der Oberseite LinkedHashMap umgesetzt werden können. Kopiert von 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; 
    } 
} 

einfach instanziiert es mit cacheSize = 10 Ihren Anwendungsfall anzupassen. Wie für , does it in O(1).

+1

Bitte beachten Sie, dass diese Implementierung nicht Thread-sicher ist und daher wahrscheinlich keine gute Lösung für eine Webanwendung ist. –

2

Sie können einfach ein Guava cache (es ist Thread-sicher!) Verwenden:

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