覆盖缓存实现的方法

时间:2012-11-13 11:01:24

标签: java caching

我正在编写一个使用LinkedHashMap实现LRU缓存的类。通常,我需要覆盖方法putget,以便在将对象添加到缓存时写入磁盘,如果在缓存中找不到对象,则从磁盘获取。

我的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

是否是一个好主意

由于

1 个答案:

答案 0 :(得分:1)

很抱歉这么说,但实际上你必须在这里解决各种问题:

  • 什么是最好/最快的java对象序列化?已在其他问题中讨论过。
  • 如何将以前写入的对象更新到文件?
  • 如果需要检索,如何有效地找到文件中存储对象的字节偏移?
  • 如何从文件中删除项目并压缩文件?
  • 如何快速写入并避免随机访问硬盘存储?

您在数据库书籍中找到的最后一个问题的所有答案。

如果您只是拥有一个不经常更改的视图对象并且您需要一个简单的解决方案,那么只需在每次放置时将HashMap序列化到该文件中。如果数据很关键,那么总是写一个新文件然后删除旧文件是一件好事,以防止数据丢失。

BTW:在您的示例代码中,删除了存储的磁盘对象。