Lru缓存的简单实现
2012-01-06 09:48
302 查看
最近最少使用算法设计的MAP缓存
使用LinkedHashMap特性,完成当缓存超过指定容量时,挤掉最久未使用的资源。
具体编写的工具类如下:
一、Cache类 继承LinkedHashMap 用于存储数据
二、LruCacheMap缓存操作类 定义一定量的缓存 对外开放使用接口
使用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(); } }
相关文章推荐
- Java 实现简单的内存对象LRU缓存
- 使用go语言的list实现一个简单的LRU缓存
- 简单LRU算法实现缓存
- LinkedHashMap实现简单的LRU缓存
- 简单LRU算法实现缓存
- 利用LinkedHashMap简单实现基于LRU策略的缓存
- LRU缓存-java简单实现
- Java实现简单的LRU缓存(A Simple LRU Cache in 5 lines)
- Java实现简单的LRU缓存(A Simple LRU Cache in 5 lines)
- Java实现简单的LRU缓存(A Simple LRU Cache in 5 lines)
- 简单LRU算法实现缓存
- 简单LRU算法实现缓存
- 简单LRU算法实现缓存
- 简单的java缓存实现(LRU,LFU,FIFO)
- 简单LRU算法实现缓存大小的限制策略
- LinkedHashMap实现简单的LRU缓存
- 最简单lru缓存及改进版本(java备忘)
- Java简易LRU缓存实现(开发技巧)
- Flask回掉接入点简单实现静态页面缓存
- 简单的PHP缓存设计实现代码