2016-08-25 11 views
0

java에서 LRU 캐시를 사용하고 있으며 removeEldest를 대체했습니다.제거하기 전에 Java LRU 캐시를 가장 오래 걸림

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

하지만 제거하기 전에 getEldestEntry를 사용하여 지속성을 유지하려고합니다. removeEldestEntry를 수행하기 전에 어떻게 getEldestEntry를 할 수 있습니까?

+0

어떤 LRU 캐시 구현을 사용하고 있습니까? – marthursson

+0

그 매개 변수는 무엇입니까? – Kayaman

답변

0

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 구현을 작성, 캐시와 함께, 당신은 걸 등록 모든 설정.

그러나 처리해야 할 다른 많은 것들이 있습니다. 응용 프로그램이 종료되면 어떻게됩니까? 이 경우에도 모든 값을 유지해야합니까? 또한 영속성이 작동하지 않는다면 어떤 종류의 오류 처리가 필요합니다 (데이터베이스가 다운 되었습니까?). 이 경우 어떻게해야합니까? 어쩌면 항목을 유지하거나 최소한 뭔가를 잘못 기록 했어야합니다.

+0

솔루션을 제공해 주셔서 감사합니다. 나는 그런 것들을 시도 할 것이다. – shadab