近期再作一個項目,是個網站管理系統,涉及多張記錄表和欄目表,簡單實現網站首頁訪問後發現速度很憂傷。仔細一想,每次訪問,要查詢各類表,訪問數據庫次數太多了,並且不少表裏的數據其實在實際中不常改變,因此想到讀取後存儲在內存中,下次直接返回。java
因而問題來了,不可能每一個網站都存在內存裏啊,雖然如今開發階段沒幾個網站。這就須要在存新網站數據時清除內存中某些網站的數據,清除誰?我想到了操做系統中的一種頁面置換算法——LRU(Least Recently Used)近期最少使用算法。算法
顯然HashMap不夠用了,我能想到最簡單的方法就是用LinkedHashMap,他的一個構造函數:數據庫
LinkedHashMap<K, V>(int initialCapacity, float loadFactor, boolean accessOrder) Constructs an empty LinkedHashMap instance with the specified initial capacity, load factor and ordering mode. Parameters: initialCapacity the initial capacity loadFactor the load factor accessOrder the ordering mode - true for access-order, false for insertion-order
關鍵在最後一個參數,只要設置爲true,就會以訪問順序排序,這就是實現LRU算法的基礎,接下來只要再重寫removeEldestEntry(Map.Entry<K, V> eldest) 方法就能夠了。緩存
由於要重寫方法,因此新建一個類繼承LinkedHashMap:ide
package com.swust.kelab.util; import java.util.LinkedHashMap; import java.util.Map; public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V> { private static final long serialVersionUID = -7971438719252105001L; private int capacity;// 容量 public LRULinkedHashMap(int capacity) { super(16, 0.75f, true); this.capacity = capacity; } // 實現LRU的關鍵方法,若是map裏面的元素個數大於了緩存最大容量,則刪除鏈表的頂端元素 @Override public boolean removeEldestEntry(Map.Entry<K, V> eldest) { return size() > capacity; } }
一個簡單的LRU緩存管理就這樣完成。
函數