您的位置:首页 > 编程语言 > Java开发

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

2016-11-18 17:44 525 查看
有的时候需要用因为效率问题需要使用一些最底层的代码开发,免不了部分地方又要采用高级一点的功能,因此,此时需要自己动手实现一部分逻辑,此处使用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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java