zoukankan      html  css  js  c++  java
  • 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]

  • 相关阅读:
    Golang Json文件解析为结构体工具-json2go
    沉浸式状态栏的简易实现
    高级数据结构及应用 —— 使用 bitmap 进行字符串去重
    机器学习:Kullback-Leibler Divergence (KL 散度)
    机器学习: 共轭梯度算法(PCG)
    二进制比特位运算
    C 语言经典面试题 —— 宏
    python base64 编解码,转换成Opencv,PIL.Image图片格式
    Kaggle:House Prices: Advanced Regression Techniques 数据预处理
    maven 细节 —— scope、坐标
  • 原文地址:https://www.cnblogs.com/charm-j/p/10373232.html
Copyright © 2011-2022 走看看