import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.reflect.Field;
import java.util.Hashtable;
/**
* 简单的缓存工具
*
* @param <K> 缓存对象的主键
* @param <V> 缓存实例
*/
public class DataCache<K, V> {
private volatile static DataCache dataCache;
private Hashtable<K, DataReference> dataReferenceMap;
private ReferenceQueue<V> dataQueue;
private DataCache() {
dataReferenceMap = new Hashtable();
dataQueue = new ReferenceQueue();
}
private class DataReference extends SoftReference<V> {
private K key;
public DataReference(V data, String primaryKey) throws Exception {
super(data, dataQueue);
try {
Field field = data.getClass().getDeclaredField(primaryKey);
field.setAccessible(true);
key = (K) field.get(data);
}catch (Exception e){
throw e;
}
}
}
public static DataCache createCache() {
if (dataCache == null) {
synchronized (DataCache.class) {
if(dataCache == null){
dataCache = new DataCache();
}
}
}
return dataCache;
}
/**
* 向缓存中添加数据
*
* @param data 待缓存的实例
* @param primaryKeyName 实例对应数据库中的主键
*/
public void setCacheValue(V data, String primaryKeyName) throws Exception {
cleanCache();
DataReference dataReference = new DataReference(data, primaryKeyName);
dataReferenceMap.put(dataReference.key, dataReference);
}
/**
* 从缓存中取数据
*
* @return
*/
public V getCacheValue(K primaryKeyValue) {
V data = null;
if(dataReferenceMap.containsKey(primaryKeyValue)){
data = dataReferenceMap.get(primaryKeyValue).get();
}
return data;
}
private void cleanCache() {
DataReference ref = null;
while ((ref = (DataReference) dataQueue.poll()) != null) {
dataReferenceMap.remove(ref.key);
}
}
public void clearAll() {
cleanCache();
dataReferenceMap.clear();
System.gc();
System.runFinalization();
}
}
实现一个高速缓存
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 奥格威,一个传奇的人物,在自己变成“黄金树”的时候,也不忘分享迅速功成名就的方法,在观察自己雇员14年后总结出一套...