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.
Welche LRU-Cache-Implementierung verwenden Sie? – marthursson
Was ist dieser Parameter? – Kayaman