极简实现LruCache(缓存淘汰算法)_2019_10-28

LRU

     简介:LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来
  进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
   	实现:
	  1.新数据插入到链表头部; 
      2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部; 
      3. 当链表满的时候,将链表尾部的数据丢弃。 
      4. 【命中率】  当存在热点数据时,LRU的效率很好,但偶发性的、周期性的批量操作会导致LRU命中率急剧下降,缓存污染情况比较严重。  
      5. 【复杂度】  实现简单。 
      6. 【代价】  命中时需要遍历链表,找到命中的数据块索引,然后需要将数据移到头部。
class FifoCache{
	//记录key值
	private LinkedList<String> keyOederList=new LinkedList<String>;
	//基于map实现数据缓存
	private HashMap<String,Object> cache=new HashMap<String,Object>;
	//存储最大容量
	private int maxMap;
	//为最大容量赋值
	public FifoCache(int maxMap){
		this.maxMap=maxMap;
	}
	//存储元素方法
	public void put(String key,Object value){
		//将key值放入链表最后
		keyOrderList.addLast(key);
		//如果链表长度大于最大容量
		if(keyOrderList.size()>maxMap){
			//移除链表最开始添加的元素
			String oldKey=keyOrderList.removeFirst();
			从map中移除该值
			cache.remove(oldKey);
		}
		cache.put(key,value);
	}
	//获取元素方法
	public Object get(String key){
	return cache.get(key);
	}
	@Override
	public String toString(){
	return cache.toString();
	}
}

public class FifoCache{
	public static void main(String[] args){
		FifoCache fifoCache=new FifoCache(2);
		fifoCache.put("A",100);
		fifoCache.put("B",200);
		fifoCache.put("C",300);
		fifoCache.put("D",400);
		System.out.println(fifoCache);
	}
}

输出结果

{C=300, D=400}

你可能感兴趣的:(极简实现LruCache(缓存淘汰算法)_2019_10-28)