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(清除最早缓存的数据,不关心是否经常使用)