自己动手写工具(一)一个用Java8实现的内存级别的缓存

有的时候需要用因为效率问题需要使用一些最底层的代码开发,免不了部分地方又要采用高级一点的功能,因此,此时需要自己动手实现一部分逻辑,此处使用map做内存级别的缓存,类似hibernate里面的一级缓存。此处的实现不只是可以在数据库上使用,其它地方也可以。
至于原理,很简单,利用map而已。复杂的实现在此处就不写了,感兴趣的童鞋可以访问我的包,下载全版的实现。

package xyz.cunzi.function.cache;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 一个内存级别的缓存实现,不建议放入static当中,否则会造成Java无法内存回收,此时应当主动调用clear方法清除
 * 
 * @author xyz.cunzi
 *
 */
public class MemoryCache {
    private Map<String, Object> map = new ConcurrentHashMap<String, Object>();

    private MemoryCache() {
    }

    /**
     * 初始化一个新的缓存器
     * 
     * @return
     */
    public static MemoryCache instance() {
        return new MemoryCache();
    }

    /**
     * 
     * @param key
     *            主键生成器,调用此函数应当返回要查询的主键
     * @param clazz
     *            查询到的值得存储类型
     * @param load
     *            如果没找到,那么使用主键从此函数中查询
     * @return
     */
    public <T, V> T load(Supplier<V> key, Class<T> clazz, Function<V, T> load) {
        V k = key.get();
        return load(k, clazz, load);
    }

    /**
     * 
     * @param key
     *            主键
     * @param clazz
     *            查询到的值得存储类型
     * @param load
     *            如果没找到,那么使用主键从此函数中查询
     * @return
     */
    @SuppressWarnings("unchecked")
    public <T, V> T load(V key, Class<T> clazz, Function<V, T> load) {
        Object t = map.get(clazz.getName() + "." + key);
        if (t == null) {
            t = load.apply(key);
            map.put(clazz.getName() + "." + key, t);
        }
        if (t.getClass() == clazz) {
            return (T) t;
        }
        return null;
    }

    public void clear() {
        map.clear();
    }
}

猜你喜欢

转载自blog.csdn.net/u014314578/article/details/53219984