LRU缓存实现

LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”

在java中可以采用LinkedHashMap实现LRU缓存

public class LRU {

    public static void main(String[] args) {

        @SuppressWarnings("serial")
        Map<String, String> map = new LinkedHashMap<String, String>(15, 0.75f, true) {

            // 重写这个方法的目的是当entry超过5的时候,会将最先放入(即最近最少使用)的entry删除
            @Override
            protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
                return size() > 5;
            }

            @Override
            public String toString() {
                StringBuilder sb = new StringBuilder();
                for (Map.Entry<String, String> entry : entrySet()) {
                    sb.append(String.format("%s:%s ", entry.getKey(), entry.getValue()));
                }
                return sb.toString();
            }
        };

        map.put("1", "11");
        map.put("2", "11");
        map.put("3", "11");
        map.put("4", "11");
        map.put("5", "11");
        map.put("6", "11");
        System.out.println(map.toString());

        map.put("7", "11");
        map.get("3");
        map.get("5");
        System.out.println(map.toString());

    }
}

 打印:

 

注意:

通过这个removeEldestEntry方法,可以理解为什么是从head节点删除entry了,因为linkedHashMap有一种遍历顺序是按照访问顺序遍历的,每次访问过的etnry会从
原来的位置删除,添加到tail节点后。那样removeEledestEntry时从head节点开始就是删除最近最少访问的entry了。

在JVM中Ehcache的缓存策略包含

1  LRU - least recently used(最近最少使用)

2  LFU - least frequently used(最不经常使用)

3  FIFO - first in first out, the oldest element by creation time(清除最早缓存的数据,不关心是否经常使用)

posted @ 2019-07-16 11:25  踏月而来  阅读(762)  评论(0编辑  收藏  举报