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é.
Quelle implémentation du cache LRU utilisez-vous? – marthursson
Quel est ce paramètre? – Kayaman