Java LRU 缓存在删除之前检索最旧的
Java LRU cache retrieve eldest before removing
我在 java 中使用 LRU 缓存并覆盖了 removeEldest。
@Override protected boolean removeEldestEntry (Map.Entry<K,V> eldest) {
return size() > LRUConcurrentCache.this.cacheSize;
}
但在删除之前我想获取 getEldestEntry 以保持持久性。如何在执行 removeEldestEntry 之前获取 EldestEntry?
我猜您有一个 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 实现来保留所提供的条目,将其注册到缓存中,一切就绪。
但是请注意,您还需要处理许多其他事情,例如当您的应用程序关闭时会发生什么?在这种情况下是否也需要保留所有值?此外,如果持久性不起作用(数据库关闭?),您显然需要某种错误处理。在那种情况下会发生什么?也许应该保留该条目,或者 - 至少 - 您需要记录出现问题的情况。
我在 java 中使用 LRU 缓存并覆盖了 removeEldest。
@Override protected boolean removeEldestEntry (Map.Entry<K,V> eldest) {
return size() > LRUConcurrentCache.this.cacheSize;
}
但在删除之前我想获取 getEldestEntry 以保持持久性。如何在执行 removeEldestEntry 之前获取 EldestEntry?
我猜您有一个 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 实现来保留所提供的条目,将其注册到缓存中,一切就绪。
但是请注意,您还需要处理许多其他事情,例如当您的应用程序关闭时会发生什么?在这种情况下是否也需要保留所有值?此外,如果持久性不起作用(数据库关闭?),您显然需要某种错误处理。在那种情况下会发生什么?也许应该保留该条目,或者 - 至少 - 您需要记录出现问题的情况。