LRU 캐시의 맞춤 구현이 있다고 생각합니다. 이 경우, 나는 즉 CacheExpirationListener 인터페이스를 생성,이 문제에 리스너 접근 방식을 추천 할 것입니다 (자바 8을 사용하는 경우이 꼭 필요한 것은, 당신은 단지뿐만 아니라 소비자 인터페이스를 사용할 수 있습니다) :
public interface CacheExpirationListener<V> {
void entryExpired(V value);
}
지금 캐시 구현이 청취자를 추적 있는지 확인하고 실제로 제거 항목하기 전에 적절하게 호출 : 이제
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;
}
}
, 제공된 항목을 계속 CacheExpirationListener 구현을 작성, 캐시와 함께, 당신은 걸 등록 모든 설정.
그러나 처리해야 할 다른 많은 것들이 있습니다. 응용 프로그램이 종료되면 어떻게됩니까? 이 경우에도 모든 값을 유지해야합니까? 또한 영속성이 작동하지 않는다면 어떤 종류의 오류 처리가 필요합니다 (데이터베이스가 다운 되었습니까?). 이 경우 어떻게해야합니까? 어쩌면 항목을 유지하거나 최소한 뭔가를 잘못 기록 했어야합니다.
어떤 LRU 캐시 구현을 사용하고 있습니까? – marthursson
그 매개 변수는 무엇입니까? – Kayaman