LRU

释义:

LRU是Least Recently Used的缩写,即最近最少使用。LRU算法:淘汰掉最不经常使用的数据。

使用背景:
计算机体系结构中,最大的最可靠的存储是硬盘,它容量很大,并且内容可以固化,但是访问速度很慢,所以需要把使用的内容载入内存中;
内存速度很快,但是容量有限,并且断电后内容会丢失。
速度越快的地方,单位成本越高,容量越小,新的内容不断被载入,旧的内容肯定要被淘汰。

利用LinkedHashMap实现LRU:

原理:

LinkedHashMap可以按照访问顺序保存元素 -> 相关文档

public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) {
  super(initialCapacity, loadFactor);
  this.accessOrder = accessOrder;
}

===========================代码实现==============================

import java.util.LinkedHashMap;
import java.util.Map;
 
/**
 * LRU (Least Recently Used) 
 */
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private static final long serialVersionUID = 1L;
   // 缓存大小
    private int cacheSize;
 
  // 构造函数
    public LRUCache(int cacheSize) {
        int initCapacity = (int) Math.ceil(cacheSize / 0.75) + 1;
        // true 表示让 linkedHashMap 按照访问顺序来进行排序,最近访问的放在头部,最老访问的放在尾部。
        super(initCapacity, 0.75f, true);
        this.cacheSize = cacheSize;
    }
 
    /**
     * 淘汰掉'最年长的'缓存
     */
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        boolean result = size() > cacheSize;
        if(result){
            System.out.println("缓存key=" + eldest.getKey() + "被淘汰!");
        }
        return result;
    }

 

     /**
     * 测试验证
     */
    public static void main(String[] args) {
        LRUCache<String, String> cache = new LRUCache<String, String>(5);
        cache.put("1", "1");
        cache.put("2", "2");
        cache.put("3", "3");
        cache.put("4", "4");
        cache.put("5", "5");
 
        System.out.println("初始:");
        System.out.println(cache.keySet());


        System.out.println("访问3:");
        cache.get("3");
        System.out.println(cache.keySet());


        System.out.println("访问2:");
        cache.get("2");
        System.out.println(cache.keySet());


        System.out.println("增加数据6,7:");
        cache.put("6", "6");
        cache.put("7", "7");
        System.out.println(cache.keySet());
    }

}

===========================代码实现==============================

运行结果如下:

初始化:
[1, 2, 3, 4, 5]
访问3:
[1, 2, 4, 5, 3]
访问2:
[1, 4, 5, 3, 2]
增加数据6,7:
缓存key=1 被淘汰!
缓存key=4 被淘汰!
[5, 3, 2, 6, 7]

 

posted @ 2019-02-14 10:35  烟雨缥缈  阅读(362)  评论(0编辑  收藏  举报