2016-08-25 5 views
0

Ich verwende den LRU-Cache in Java und überschreibt removeEldest.Java-LRU-Cache zuerst abrufen, bevor Sie entfernen

@Override protected boolean removeEldestEntry (Map.Entry<K,V> eldest) { 
      return size() > LRUConcurrentCache.this.cacheSize; 
     } 

Aber vor dem Entfernen möchte ichEldestEntry für Persistenz erhalten. Wie kann ichEldestEntry abrufen, bevor der removeEldestEntry ausgeführt wird?

+0

Welche LRU-Cache-Implementierung verwenden Sie? – marthursson

+0

Was ist dieser Parameter? – Kayaman

Antwort

0

Ich vermute, Sie haben eine benutzerdefinierte Implementierung eines LRU-Cache. In diesem Fall würde ich einen Listener Ansatz für dieses Problem empfehlen, das heißt eine CacheExpirationListener Schnittstelle erstellen (wenn Sie mit Java 8 dies nicht unbedingt notwendig ist, man könnte genauso gut die Consumer-Schnittstelle verwenden):

public interface CacheExpirationListener<V> { 
    void entryExpired(V value); 
} 

Nun stellen Sie sicher, Ihre Cache-Implementierung Spur seiner Zuhörer hält und nennt sie entsprechend, bevor sie tatsächlich zu entfernen Artikel:

public class MyCacheImplementation<K, V> extends LinkedHashMap<K, V> { 
    private final List<CacheExpirationListener<V>> removalListeners = new ArrayList<>(); 

    public void addRemovalListener(CacheExpirationListener<V> listener) { 
     removalListeners.add(listener) 
    } 

    protected boolean removeEldestEntry(Map.Entry<K,V> eldest) { 
     if(size() > LRUConcurrentCache.this.cacheSize) { 
      removalListeners.forEach(CacheExpirationListener::entryExpired); 
      return true; 
     } 

     return false; 
    } 
} 

erstellen Sie jetzt eine CacheExpirationListener Implementierung, die den mitgelieferten Eintrag bestehen bleibt, registrieren, dass mit dem Cache, und du bist alles bereit.

Beachten Sie jedoch, dass es viele andere Sachen gibt, die Sie handhaben müssen, z. Was passiert, wenn Ihre Anwendung heruntergefahren wird? Müssen alle Werte auch in diesem Fall beibehalten werden? Außerdem würden Sie natürlich eine Art von Fehlerbehandlung benötigen, wenn die Persistenz nicht funktioniert (Datenbank inaktiv?). Was sollte in diesem Fall passieren? Vielleicht sollte der Eintrag beibehalten werden oder - zumindest - Sie müssen protokollieren, dass etwas schief gelaufen ist.

+0

Danke für die Lösung. Ich werde diese Dinge versuchen. – shadab

Verwandte Themen