上次设计的那个缓存仅仅是个粗糙的模板,存在内存溢出的风险,今天又学习些东西重新构建了一个本地缓存类(可以设置大小)
本次缓存类使用了LUR算法+LinkedHashMap来实现的.
本次借鉴的是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