单线程Lru缓存

单线程Lru缓存

Posted by candy1126xx on June 8, 2017

思路

Lru缓存一般利用LinkedHashMap,accessOrder置为true,则自动按照访问顺序排序,最近访问的排在前面。

实现

public abstract class LruCache<T> {

    // 缓存的容器
    private final LinkedHashMap<String, T> cache = new LinkedHashMap<>(100, 0.75f, true);
    // 缓存最大值设置为100KB
    private final int initialMaxSize = 100;
    private int currentSize = 0;

    // 获取对象所占内存大小
    abstract int getSize(T item);

    // 读取
    public T get(String key) {
        return cache.get(key);
    }

    // 储存
    public void put(String key, T item) {
        final int itemSize = getSize(item);
        // 如果储存对象大于最大容量,不储存
        if (itemSize >= maxSize) {
            return null;
        }
        // 储存,然后Lru清理空间
        cache.put(key, item);
        currentSize += itemSize;
        trimToSize(initialMaxSize);
    }

    // 清理空间到size
    private void trimToSize(int size) {
        Map.Entry<String, T> last;
        while (currentSize > size) {
            last = cache.entrySet().iterator().next();
            final T toRemove = last.getValue();
            currentSize -= getSize(toRemove);
            final T key = last.getKey();
            cache.remove(key);
        }
    }
}