美文网首页RxJava编程语言爱好者Java
基于LinkedHashMap手写LRU淘汰策略

基于LinkedHashMap手写LRU淘汰策略

作者: 迦叶_金色的人生_荣耀而又辉煌 | 来源:发表于2021-01-02 07:07 被阅读0次

    上一篇 <<<JDK8的HashMap中红黑树左旋右旋原理图解
    下一篇 >>>


    LRU(最近最少使用)缓存淘汰算法一般用于缓存场景,当缓存满的时候,把最少使用的数据清掉。

    方案1:当key使用的时候,count值+1,最后遍历key的count值,把最小的key清理出去。缺点是数据量大时遍历效率低
    方案2:基于LinkedHashMap有序集合实现
    原理:访问key的时候,就会将该key存放到链表最后的位置,链表最开头位置说明最近最少使用的

    public class ManualLruAlgorithm<K, V> extends LinkedHashMap<K, V> {
        /**
         * 容量
         */
        private int capacity;
    
        public ManualLruAlgorithm(int capacity) {
            // 末尾accessOrder设置为true,表示访问顺序,当有访问时,key被挪到末尾,最前面是最少使用的数据
            super(capacity, 0.75f, true);
            this.capacity = capacity;
        }
    
        /**
         * 列表大小大于容量时,清理头结点
         */
        @Override
        protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
            return size() > capacity;
        }
    
        public static void main(String[] args) {
            ManualLruAlgorithm<String, String> lruCache = new ManualLruAlgorithm<>(3);
            lruCache.put("a","a");
            lruCache.put("b","b");
            lruCache.put("c","c");
            lruCache.put("d","d");
            // 打印结果:bcd,a已被淘汰
            lruCache.forEach((k, v) -> {
                System.out.print(k );
            });
            System.out.println();
            lruCache.put("c","e");
            // 打印结果:bdc,c已被挪到末尾
            lruCache.forEach((k, v) -> {
                System.out.print(k );
            });
        }
    }
    

    相关文章

      网友评论

        本文标题:基于LinkedHashMap手写LRU淘汰策略

        本文链接:https://www.haomeiwen.com/subject/xxqtnktx.html