Java LRU缓存在删除之前检索最旧

时间:2016-08-25 08:32:40

标签: java caching lru

我在java中使用LRU缓存并覆盖了removeEldest。

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

但是在删除之前我想获得持久性的getEldestEntry。在执行removeEldestEntry之前如何getEldestEntry?

1 个答案:

答案 0 :(得分:0)

我猜你有一个LRU缓存的自定义实现。在这种情况下,我建议使用Listener方法解决这个问题,即创建一个CacheExpirationListener接口(如果您使用Java 8,这不是绝对必要的;您也可以使用Consumer接口):

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实现,该实现持久保存所提供的条目,将其注册到缓存中,并且您已全部设置。

但请注意,您需要处理许多其他内容,例如:当您的应用程序关闭时会发生什么?在这种情况下,是否还需要保留所有值?此外,如果持久性不起作用(数据库关闭?),您显然需要某种错误处理。在那种情况下会发生什么?也许应该保留条目,或者 - 至少 - 你需要记录出错的地方。