LRU緩存算法-基於LinkedHashMap實現

    近期再作一個項目,是個網站管理系統,涉及多張記錄表和欄目表,簡單實現網站首頁訪問後發現速度很憂傷。仔細一想,每次訪問,要查詢各類表,訪問數據庫次數太多了,並且不少表裏的數據其實在實際中不常改變,因此想到讀取後存儲在內存中,下次直接返回。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緩存管理就這樣完成。
函數

相關文章
相關標籤/搜索