2016-08-25 3 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インターフェイスを作成し、この問題にリスナーのアプローチをお勧めします(あなたは、Java 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

関連する問題