歡迎訪問我的博客:http://wangnan.tech
LRU 緩存介紹
我們平時總會有一個電話本記錄所有朋友的電話苛白,但是在张,如果有朋友經(jīng)常聯(lián)系衩椒,那些朋友的電話號碼不用翻電話本我們也能記住,但是姿现,如果長時間沒有聯(lián)系了扼脐,要再次聯(lián)系那位朋友的時候岸军,我們又不得不求助電話本,但是瓦侮,通過電話本查找還是很費(fèi)時間的艰赞。但是,我們大腦能夠記住的東西是一定的肚吏,我們只能記住自己最熟悉的方妖,而長時間不熟悉的自然就忘記了。
其實罚攀,計算機(jī)也用到了同樣的一個概念党觅,我們用緩存來存放以前讀取的數(shù)據(jù),而不是直接丟掉斋泄,這樣杯瞻,再次讀取的時候,可以直接在緩存里面取炫掐,而不用再重新查找一遍魁莉,這樣系統(tǒng)的反應(yīng)能力會有很大提高。但是募胃,當(dāng)我們讀取的個數(shù)特別大的時候旗唁,我們不可能把所有已經(jīng)讀取的數(shù)據(jù)都放在緩存里,畢竟內(nèi)存大小是一定的痹束,我們一般把最近常讀取的放在緩存里(相當(dāng)于我們把最近聯(lián)系的朋友的姓名和電話放在大腦里一樣)检疫。
LRU 緩存利用了這樣的一種思想。LRU 是 Least Recently Used 的縮寫参袱,翻譯過來就是“最近最少使用”,也就是說秽梅,LRU 緩存把最近最少使用的數(shù)據(jù)移除抹蚀,讓給最新讀取的數(shù)據(jù)。而往往最常讀取的企垦,也是讀取次數(shù)最多的环壤,所以,利用 LRU 緩存钞诡,我們能夠提高系統(tǒng)的 performance郑现。
實現(xiàn)
使用LinkedHashMap
好處:
- 它本身已經(jīng)實現(xiàn)了按照訪問順序的存儲湃崩,也就是說,最近讀取的會放在最前面接箫,最最不常讀取的會放在最后(當(dāng)然攒读,它也可以實現(xiàn)按照插入順序存儲)。
- LinkedHashMap 本身有一個方法用于判斷是否需要移除最不常讀取的數(shù)辛友,但是薄扁,原始方法默認(rèn)不需要移除,所以邓梅,我們需要 override 這樣一個方法,使得當(dāng)緩存里存放的數(shù)據(jù)個數(shù)超過規(guī)定個數(shù)后日缨,就把最不常用的移除掉。
代碼
public class LRUCache {
private int capacity;
private Map<Integer, Integer> cache;
public LRUCache(int capacity) {
this.capacity = capacity;
this.cache = new java.util.LinkedHashMap<Integer, Integer> (capacity, 0.75f, true) {
// 定義put后的移除規(guī)則匣距,大于容量就刪除eldest
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
return size() > capacity;
}
};
}
public int get(int key) {
if (cache.containsKey(key)) {
return cache.get(key);
} else
return -1;
}
public void set(int key, int value) {
cache.put(key, value);
}
}
參考: