我正在编写一个使用LinkedHashMap
实现LRU缓存的类。通常,我需要覆盖方法put
和get
,以便在将对象添加到缓存时写入磁盘,如果在缓存中找不到对象,则从磁盘获取。
我的LRUCache类看起来像:
public class LRUCache<K, V> extends LinkedHashMap<K, V>
implements Serializable {
/**
* File where the elements of the cache are stored
*/
private File cacheFile = null;
/**
* UID of the class for serialization.
*/
private static final long serialVersionUID = 1L;
/**
* Maximum number of entries in the cache.
*/
private final int maxEntries;
/**
* Default constructor of the cache.
*
* @param newMaxEntries
* the maximum number of entries in the cache.
*/
public LRUCache(final int newMaxEntries, String fileName) {
super(newMaxEntries + 1, 1.0f, true);
this.maxEntries = newMaxEntries;
this.cacheFile = new File(fileName);
}
@Override
public V get(Object key) {
V VObject = super.get(key);
if (VObject == null) {
// TODO: Fetch from disk
}
return VObject;
}
@Override
public V put(K key, V value) {
// TODO: Write to disk
return super.put(key, value);
}
@Override
protected final boolean
removeEldestEntry(final Map.Entry<K, V> eldest) {
return super.size() > maxEntries;
}
}
我的问题是我如何能够尽可能快地覆盖这两种方法。高速缓存的对象实现Externalize
?
由于
答案 0 :(得分:1)
很抱歉这么说,但实际上你必须在这里解决各种问题:
您在数据库书籍中找到的最后一个问题的所有答案。
如果您只是拥有一个不经常更改的视图对象并且您需要一个简单的解决方案,那么只需在每次放置时将HashMap序列化到该文件中。如果数据很关键,那么总是写一个新文件然后删除旧文件是一件好事,以防止数据丢失。
BTW:在您的示例代码中,删除了存储的磁盘对象。