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]