您的位置:首页 > 其它

Lru缓存的简单实现

2012-01-06 09:48 302 查看
最近最少使用算法设计的MAP缓存

使用LinkedHashMap特性,完成当缓存超过指定容量时,挤掉最久未使用的资源。

具体编写的工具类如下:

一、Cache类 继承LinkedHashMap 用于存储数据

class Cache extends LinkedHashMap<String, Object>{
private static final long serialVersionUID = -1468138250444907129L;
/** 初始最大元素容量*/
private static int DEFAULT_MAX_CAPACITY=16;
/** MAP增长因子*/
private static float DEFAULT_FACTOR=0.75f;
/**最大缓存 默认1M*/
private long maxBufferMen=1*1024*1024;
/**当前缓存*/
private long currentBufferMen;
/**存储类别*/
private int category;
/**
* 构造器
* @param maxBufferMen 最大缓存
* @param category 存储类别 <br/>
* 			-参数 <tt>1</tt>:Image(bitmap)<br/>
* 			-参数 <tt>0</tt>:MCP/STYLE/APPCFG(String)
*/
public Cache(long maxBufferMen,int category){
super(DEFAULT_MAX_CAPACITY, DEFAULT_FACTOR, true);
this.maxBufferMen=maxBufferMen;
this.category=category;
}

/**
* 取得元素耗费存储空间大小(包括键和值)
* @param key 键
* @param value 值
* @return
*/
public long getCacheBuffer(String key, Object value){
if(category==0){
long valueSize = ((String)value).getBytes().length;
return valueSize;
}
else if(category==1){

}
return 0;
}
/**
* 重写put方法 放入元素时 对当前缓存大小进行调整
*/
@Override
public Object put(String key, Object value) {
currentBufferMen+=getCacheBuffer(key,value);
return super.put(key, value);
}

/**
* 移除判定:当前缓存大于最大缓存<br/>
* 需要调整当前缓存大小
*/
@Override
protected boolean removeEldestEntry(Map.Entry<String,Object> eldest) {
boolean result=currentBufferMen>maxBufferMen;
if(result){
Iterator<Map.Entry<String, Object>> it=this.entrySet().iterator();
if(it.hasNext()){
Map.Entry<String, Object> entry=it.next();
currentBufferMen-=getCacheBuffer(entry.getKey(), entry.getValue());
}
}
return result;
}
}

二、LruCacheMap缓存操作类 定义一定量的缓存 对外开放使用接口

class LruCacheMap{

/**图片最大缓存容量*/
private static final long MAX_IMG_BUFFER=5*1024*1024;
/**配置最大缓存容量*/
private static final long MAX_APPCFG_BUFFER=1*1024*1024;

private static LruCacheMap lruCaheMap;
/** image图片缓存*/
private static Map<String, Object> imgCache;
/** appConfig文件缓存*/
private static Map<String, Object> appCfgCache;
/** 同步锁*/
private static Object lock=new Object();
/** 无参构造器*/
private LruCacheMap(){
imgCache=Collections.synchronizedMap(new Cache(MAX_IMG_BUFFER,1));
appCfgCache=Collections.synchronizedMap(new Cache(MAX_APPCFG_BUFFER,0));
}
/**
* 无参单例实例化方法
* @return LruCaheMap实例
*/
public static LruCacheMap newInstance(){
if(lruCaheMap==null){
synchronized (lock) {
if(lruCaheMap==null)
lruCaheMap=new LruCacheMap();
}
}
return lruCaheMap;
}

/** 图片元素个数*/
public int imgSize(){return imgCache.size();}
/** 配置信息元素个数*/
public int appCfgSize(){return appCfgCache.size();}

/**
* 根据键值取得图片元素
* @param key 键
* @return
*/
public Object getImg(String key){
return imgCache.get(key);
}
/**
* 根据键值取得配置信息元素
* @param key 键
* @return
*/
public Object getAppCfg(String key){
return appCfgCache.get(key);
}

/**
* 存入图片元素
* @param key 键
* @param value 值
*/
public void putImg(String key,Object value){
imgCache.put(key, value);
}
/**
* 存入配置信息元素
* @param key 键
* @param value 值
*/
public void putAppCfg(String key,Object value){
appCfgCache.put(key, value);
}

/** 清空图片缓存*/
public void clearImg(){
imgCache.clear();
}
/** 清空配置缓存*/
public void clearAppCfg(){
appCfgCache.clear();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: