Lru缓存的简单实现

         最近最少使用算法设计的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();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值