2016-03-25 8 views
2

Ich versuche, einen Cache mit Guava Cache-Bibliothek zu erstellen. Eine meiner Hauptanforderungen ist, dass ich den Cache-Ablauf nach der CacheLoader.load (..) -Funktion setzen möchte, anstatt der meisten Beispiele, die ich im Web gesehen habe, wie die unten stehende.Guava-Cache: Wie setze ich den Ablauf auf 'CacheLoader.load()' statt während CacheBuilder.newBuilder()?

LoadingCache<String, MyClass> myCache = 
CacheBuilder.newBuilder().maximumSize(MAX_SIZE).expireAfterWrite(10, TimeUnit.Minutes).build(cacheLoader); 

Der Grund dafür ist, dass das Objekt aus der Datenbank durch die CacheLoader.load abgerufen (...) Funktion, um die Verfallsdaten enthält. Ich möchte diese Information anstelle eines "zufälligen" statischen Wertes verwenden.

Ich möchte so etwas.

LoadingCache<String, MyClass> myCache = 
CacheBuilder.newBuilder().maximumSize(MAX_SIZE).build(cacheLoader); 

...

CacheLoader meCacheLoder = new CacheLoader<String MyClass>(){ 
    @Override 
    public MyClass load(String key) throws Exception { 
     // Retrieve the MyClass object from database using 'key' 
     MyClass myObj = getMyObjectFromDb(key); 
     int expiry = myObj.getExpiry(); 

     // Now somehow set this 'expiry' value with the cache 
     ???? 

     return myObj; 
    } 
}; 

ODER Gibt es eine bessere Option als Guava-Cache für diesen Zweck?

+2

Nein, es gibt keine Möglichkeit, pro-Eintrag Ablaufzeiten mit Guava Cache einzustellen. Eine Diskussion finden Sie unter https://github.com/google/guava/issues/1203. –

+0

Danke @LouisWasserman. –

+1

Mögliches Duplikat von [Google Guava Cache - Ändern Sie die Räumungs-Zeitüberschreitungswerte während der Laufzeit] (http://stackoverflow.com/questions/26843814/google-guava-cache-change-the-eviction-timeout-values-during-run) (Zeit) – rkosegi

Antwort

1

Es gibt kein solches Merkmal in Guava, wie Louis schon darauf hingewiesen hat.

Zum Beispiel können Sie EHCache oder cache2k verwenden. Für cache2k kann ich Ihnen schnell Richtungen geben, da dies eine Kernfunktion ist verwenden wir regelmäßig:

können Sie entweder implementieren die Schnittstelle ValueWithExpiryTime auf dem Wert-Objekt, das ist:

interface ValueWithExpiryTime { 

    long getCacheExpiryTime(); 

} 

Alternativ können Sie ein registrieren EntryExpiryCalculator um den Zeitwert zu extrahieren. Der Cache wird wie folgt aufgebaut:

Die Zeit ist der Standard lange Typ in Millisekunden seit der Epoche dargestellt. Standardmäßig läuft der Ablauf nicht genau zur angegebenen Zeit ab, sondern null oder einige Millisekunden später, abhängig von der Auslastung Ihrer Maschine. Dies ist der effektivste Modus. Wenn dies ein Problem ist, fügen Sie sharpExpiry(true) hinzu.

Disclaimer: Ich bin der Autor des cache2k ....

+0

danke cruftex. Wir werden das überprüfen. –

Verwandte Themen