有的时候需要用因为效率问题需要使用一些最底层的代码开发,免不了部分地方又要采用高级一点的功能,因此,此时需要自己动手实现一部分逻辑,此处使用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();
}
}