日期:2014-05-16 浏览次数:20398 次
public class LruCacheController implements CacheController {
private int cacheSize;
private Map cache;
private List keyList;
/**
* Default constructor
*/
public LruCacheController() {
this.cacheSize = 100;
this.cache = Collections.synchronizedMap(new HashMap());
this.keyList = Collections.synchronizedList(new LinkedList());
}
从这个方法可以看出来,如果把缓存装满后,就会删除最老的数据,将最老的数据从
keyList,cache中删除,这样就淘汰了最老的数据,其实也就是删除最近最少使用
的数据,因为只有最老的数据才会在最后面,新的数据添加到末尾。
public void putObject(CacheModel cacheModel, Object key, Object value) {
cache.put(key, value);
keyList.add(key);
if (keyList.size() > cacheSize) {
try {
Object oldestKey = keyList.remove(0);
cache.remove(oldestKey);
} catch (IndexOutOfBoundsException e) {
//ignore
}
}
}
查询对象的时候,说明这个key被使用了,就删除以前所在的位置,然后添加到最前面,这样
就可以保证经常使用的数据永远在最前面,最老的数据就是最近最少使用的数据。
就是这么个原理,这里的实现就是利用了list的remove(0)以及list.add(key)来移动
位置,这样就保证最近最少使用的数据永远在0哪些地方,实现了RLU算法。cache中的数据
位置信息不变。
public Object getObject(CacheModel cacheModel, Object key) {
Object result = cache.get(key);
keyList.remove(key);
if (result != null) {
keyList.add(key);
}
return result;
}
public Object removeObject(CacheModel cacheModel, Object key) {
keyList.remove(key);
return cache.remove(key);
}