日期:2014-05-16 浏览次数:20315 次
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); }