gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:13 25 4
gpt4 key购买 nike

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

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

但在删除之前我想 getEldestEntry 以实现持久化。在执行removeEldestEntry之前如何获取EldestEntry?

最佳答案

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

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 实现来保留所提供的条目,将其注册到缓存中,然后一切就完成了。

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

关于Java LRU 缓存在删除之前检索最旧的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39140351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com