2016-08-25 38 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