上次设计的那个缓存仅仅是个粗糙的模板,存在内存溢出的风险,今天又学习些东西重新构建了一个本地缓存类(可以设置大小)
本次缓存类使用了LUR算法+LinkedHashMap来实现的.
LRU是Least Recently Used 近期最少使用算法。
关于操作系统的内存管理,如何节省利用容量不大的内存为最多的进程提供资源,一直是研究的重要方向。而内存的虚拟存储管理,是现在最通用,最成功的方式—— 在内存有限的情况下,扩展一部分外存作为
虚拟内存,真正的内存只存储当前运行时所用得到信息。这无疑极大地扩充了内存的功能,极大地提高了计算机的并发度。虚拟页式存储管理,则是将进程所需空间划分为多个页面,内存中只存放当前所需页面,其余页面放入外存的管理方式。
LinkedHashMap自身已经实现了顺序存储,默认情况下是按照元素的添加顺序存储,也可以启用按照访问顺序存储,即最近读取的数据放在最前面,最早读取的数据放在最后面,然后它还有一个判断是否删除最老数据的方法,默认是返回false,即不删除数据,我们使用LinkedHashMap实现LRU缓存的方法就是对LinkedHashMap实现简单的扩展,扩展方式有两种,一种是inheritance,一种是delegation,具体使用什么方式看个人喜好
LinkedHashMap自身已经实现了顺序存储,默认情况下是按照元素的添加顺序存储,也可以启用按照访问顺序存储,即最近读取的数据放在最前面,最早读取的数据放在最后面,然后它还有一个判断是否删除最老数据的方法,默认是返回false,即不删除数据,我们使用LinkedHashMap实现LRU缓存的方法就是对LinkedHashMap实现简单的扩展,扩展方式有两种,一种是inheritance,一种是delegation,具体使用什么方式看个人喜好
本次借鉴的是inheritance的方式 最后会有另外一种实现的链接 可以参考
package cn.com.mx.gome.suggest.cache;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* lur算法实现定量的简单缓存
* @author songqinghu
*
*/
public class LURCache<K,V> extends LinkedHashMap<K, V> {
private final int MAX_CACHE_SIZE ;
public LURCache(int cacheSize){
super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
MAX_CACHE_SIZE = cacheSize;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
return size() > MAX_CACHE_SIZE;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (Map.Entry<K, V> entry : entrySet()) {
sb.append(String.format(" %s: %s ", entry.getKey(),entry.getValue()));
}
return sb.toString();
}
}
package cn.com.mx.gome.suggest.cache;
import java.util.Collections;
import java.util.Map;
/**
* solr中词语缓存类
* @author songqinghu
*
*/
public class WordLURCache {
private static Map<String,Integer> mapCache
= Collections.synchronizedMap(new LURCache<String,Integer>(50000));//这里的获取方式保证多线下的安全问题
public static Map<String,Integer> getWordCache(){
return mapCache;
}
}
参考资料:
http://www.cnblogs.com/lzrabbit/p/3734850.html