2016-08-25 39 views
0

我在java中使用LRU緩存,並覆蓋了removeEldest。Java LRU緩存在刪除之前檢索最老的

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

但在刪除之前我想獲取EdestaterEntry的持久性。在執行removeEldestEntry之前,我如何獲取EldestEntry?

+0

您正在使用哪種LRU Cache實現? – 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