2016-08-25 1 views
0

J'utilise le cache LRU dans java et j'ai remplacé removeEldest.Le cache Java LRU récupère le plus ancien avant de le supprimer

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

Mais avant de supprimer je veux getEldestEntry pour la persistance. Comment puis-je getEldestEntry avant de faire le removeEldestEntry?

+0

Quelle implémentation du cache LRU utilisez-vous? – marthursson

+0

Quel est ce paramètre? – Kayaman

Répondre

0

Je suppose que vous avez une implémentation personnalisée d'un cache LRU. Dans ce cas, je recommande une approche d'écoute à ce problème, à savoir créer une interface CacheExpirationListener (si vous utilisez Java 8 ce n'est pas strictement nécessaire, vous pouvez tout aussi bien utiliser l'interface consommateur):

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

maintenant, assurez-vous que votre implémentation de cache conserve la trace de ses auditeurs et les appelle en conséquence avant éléments effectivement enlever:

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; 
    } 
} 

maintenant, créez une implémentation CacheExpirationListener qui persiste à l'entrée fournie, registre qui le cache, et que vous êtes tout ensemble. Notez cependant qu'il y a beaucoup d'autres choses que vous devez gérer, par exemple. que se passe-t-il lorsque votre application s'arrête? Toutes les valeurs doivent-elles être conservées dans ce cas également? En outre, vous aurez évidemment besoin d'une sorte de gestion des erreurs si la persistance ne fonctionne pas (base de données vers le bas?). Que devrait-il se passer dans ce cas? Peut-être que l'entrée devrait être conservée ou - à tout le moins - vous devrez vous connecter que quelque chose s'est mal passé.

+0

Merci pour la solution. Je vais essayer ces choses. – shadab