1. LFU類1.1. LFU1.1.1. 原理
LFU(Least Frequently Used)演算法根據資料的曆史訪問頻率來淘汰資料,其核心思想是“如果資料過去被訪問多次,那麼將來被訪問的頻率也更高”。
1.1.2. 實現
LFU的每個資料區塊都有一個引用計數,所有資料區塊按照引用計數排序,具有相同引用計數的資料區塊則按照時間排序。
具體實現如下:
1. 新加入資料插入到隊列尾部(因為引用計數為1);
2. 隊列中的資料被訪問後,引用計數增加,隊列重新排序;
3. 當需要淘汰資料時,將已經排序的列表最後的資料區塊刪除。
1.1.3. 分析
l 命中率
一般情況下,LFU效率要優於LRU,且能夠避免周期性或者偶發性的操作導致快取命中率下降的問題。但LFU需要記錄資料的曆史訪問記錄,一旦資料訪問模式改變,LFU需要更長時間來適用新的訪問模式,即:LFU存在曆史資料影響將來資料的“緩衝汙染”效用。
l 複雜度
需要維護一個隊列記錄所有資料的訪問記錄,每個資料都需要維護引用計數。
l 代價
需要記錄所有資料的訪問記錄,記憶體消耗較高;需要基於引用計數排序,效能消耗較高。
1.2. LFU*1.2.1. 原理
基於LFU的改進演算法,其核心思想是“只淘汰訪問過一次的資料”。
1.2.2. 實現
LFU*資料緩衝實現和LFU一樣,不同的地方在於淘汰資料時,LFU*只淘汰引用計數為1的資料,且如果所有引用計數為1的資料大小之和都沒有新加入的資料那麼大,則不淘汰資料,新的資料也不緩衝。
1.2.3. 分析
l 命中率
和LFU類似,但由於其不淘汰引用計數大於1的資料,則一旦訪問模式改變,LFU*無法緩衝新的資料,因此這個演算法的應用情境比較有限。
l 複雜度
需要維護一個隊列,記錄引用計數為1的資料。
l 代價
相比LFU要低很多,不需要維護所有資料的曆史訪問記錄,只需要維護引用次數為1的資料,也不需要排序。
1.3. LFU-Aging1.3.1. 原理
基於LFU的改進演算法,其核心思想是“除了訪問次數外,還要考慮訪問時間”。這樣做的主要原因是解決LFU緩衝汙染的問題。
1.3.2. 實現
雖然LFU-Aging考慮時間因素,但其演算法並不直接記錄資料的訪問時間,而是通過平均引用計數來標識時間。
LFU-Aging在LFU的基礎上,增加了一個最大平均引用計數。噹噹前緩衝中的資料“引用計數平均值”達到或者超過“最大平均引用計數”時,則將所有資料的引用計數都減少。減少的方法有多種,可以直接減為原來的一半,也可以減去固定的值等。
1.3.3. 分析
l 命中率
LFU-Aging的效率和LFU類似,當訪問模式改變時,LFU-Aging能夠更快的適用新的資料訪問模式,效率要高。
l 複雜度
在LFU的基礎上增加平均引用次數判斷和處理。
l 代價
和LFU類似,當平均引用次數超過指定閾值(Aging)後,需要遍曆訪問列表。
1.4. LFU*-Aging1.4.1. 原理
LFU*和LFU-Aging的合成體。
1.4.2. 實現
略。
1.4.3. 分析
l 命中率
和LFU-Aging類似。
l 複雜度
比LFU-Aging簡單一些,不需要基於引用計數排序。
l 代價
比LFU-Aging少一些,不需要基於引用計數排序。
1.5. Window-LFU1.5.1. 原理
Windows-LFU是LFU的一個改進版,差別在於Window-LFU並不記錄所有資料的訪問曆史,而只是記錄過去一段時間內的訪問曆史,這就是Window的由來,基於這個原因,傳統的LFU又被稱為“Perfect-LFU”。
1.5.2. 實現
與LFU的實現基本相同,差別在於不需要記錄所有資料的曆史訪問資料,而只記錄過去一段時間內的訪問曆史。具體實現如下:
1)記錄了過去W個訪問記錄;
2)需要淘汰時,將W個訪問記錄按照LFU規則排序淘汰
舉例如下:
假設曆史訪問記錄長度設為9,緩衝大小為3,圖中不同顏色代錶針對不同資料區塊的訪問,同一顏色代錶針對同一資料的多次訪問。
範例1:黃色訪問3次,藍色和橘色都是兩次,橘色更新,因此緩衝黃色、橘色、藍色三個資料區塊
範例2:綠色訪問3次,藍色兩次,暗紅兩次,藍色更新,因此緩衝綠色、藍色、暗紅三個資料區塊
1.5.3. 分析
l 命中率
Window-LFU的命中率和LFU類似,但Window-LFU會根據資料的訪問模式而變化,能夠更快的適應新的資料訪問模式,”緩衝汙染“問題不嚴重。
l 複雜度
需要維護一個隊列,記錄資料的訪問流曆史;需要排序。
l 代價
Window-LFU只記錄一部分的訪問記錄,不需要記錄所有的資料訪問曆史,因此記憶體消耗和排序消耗都比LFU要低。
1.6. LFU類演算法對比
由於不同的訪問模型導致命中率變化較大,此處對比僅基於理論定性分析,不做定量分析。
對比點 |
對比 |
命中率 |
Window-LFU/LFU-Aging > LFU*-Aging > LFU > LFU* |
複雜度 |
LFU-Aging > LFU> LFU*-Aging >Window-LFU > LFU* |
代價 |
LFU-Aging > LFU > Window-LFU > LFU*-Aging > LFU* |