兩種常見的快取淘汰演算法LFU LRU

2021-08-14 18:41:29 字數 2110 閱讀 9561

1. lfu

1.1. 原理

lfu(least frequently used)演算法根據資料的歷史訪問頻率來淘汰資料,其核心思想是「如果資料過去被訪問多次,那麼將來被訪問的頻率也更高」。

1.2. 實現

lfu的每個資料塊都有乙個引用計數,所有資料塊按照引用計數排序,具有相同引用計數的資料塊則按照時間排序。

具體實現如下:

1. 新加入資料插入到佇列尾部(因為引用計數為1);

2. 佇列中的資料被訪問後,引用計數增加,佇列重新排序;

3. 當需要淘汰資料時,將已經排序的列表最後的資料塊刪除。

1.3. 分析

l 命中率

一般情況下,lfu效率要優於lru,且能夠避免週期性或者偶發性的操作導致快取命中率下降的問題。但lfu需要記錄資料的歷史訪問記錄,一旦資料訪問模式改變,lfu需要更長時間來適用新的訪問模式,即:lfu存在歷史資料影響將來資料的「快取汙染」效用。

l 複雜度

需要維護乙個佇列記錄所有資料的訪問記錄,每個資料都需要維護引用計數。

l 代價

需要記錄所有資料的訪問記錄,記憶體消耗較高;需要基於引用計數排序,效能消耗較高。

2. lru

2.1. 原理

lru(least recently used,最近最少使用)演算法根據資料的歷史訪問記錄來進行淘汰資料,其核心思想是「如果資料最近被訪問過,那麼將來被訪問的機率也更高」。

2.2. 實現

最常見的實現是使用乙個鍊錶儲存快取資料,詳細演算法實現如下:

1. 新資料插入到鍊錶頭部;

2. 每當快取命中(即快取資料被訪問),則將資料移到鍊錶頭部;

3. 當鍊表滿的時候,將鍊錶尾部的資料丟棄。

2.3. 分析

【命中率】

當存在熱點資料時,lru的效率很好,但偶發性的、週期性的批量操作會導致lru命中率急劇下降,快取汙染情況比較嚴重。

【複雜度】

實現簡單。

【代價】

命中時需要遍歷鍊錶,找到命中的資料塊索引,然後需要將資料移到頭部。

3. lru-k

3.1. 原理

lru-k中的k代表最近使用的次數,因此lru可以認為是lru-1。lru-k的主要目的是為了解決lru演算法「快取汙染」的問題,其核心思想是將「最近使用過1次」的判斷標準擴充套件為「最近使用過k次」。

3.2. 實現

相比lru,lru-k需要多維護乙個佇列,用於記錄所有快取資料被訪問的歷史。只有當資料的訪問次數達到k次的時候,才將資料放入快取。當需要淘汰資料時,lru-k會淘汰第k次訪問時間距當前時間最大的資料。詳細實現如下:

1. 資料第一次被訪問,加入到訪問歷史列表;

2. 如果資料在訪問歷史列表裡後沒有達到k次訪問,則按照一定規則(fifo,lru)淘汰;

3. 當訪問歷史佇列中的資料訪問次數達到k次後,將資料索引從歷史佇列刪除,將資料移到快取佇列中,並快取此資料,快取佇列重新按照時間排序;

4. 快取資料佇列中被再次訪問後,重新排序;

5. 需要淘汰資料時,淘汰快取佇列中排在末尾的資料,即:淘汰「倒數第k次訪問離現在最久」的資料。

lru-k具有lru的優點,同時能夠避免lru的缺點,實際應用中lru-2是綜合各種因素後最優的選擇,lru-3或者更大的k值命中率會高,但適應性差,需要大量的資料訪問才能將歷史訪問記錄清除掉。

3.3. 分析

【命中率】

lru-k降低了「快取汙染」帶來的問題,命中率比lru要高。

【複雜度】

lru-k佇列是乙個優先順序佇列,演算法複雜度和代價比較高。

【代價】

由於lru-k還需要記錄那些被訪問過、但還沒有放入快取的物件,因此記憶體消耗會比lru要多;當資料量很大的時候,記憶體消耗會比較可觀。

lru-k需要基於時間進行排序(可以需要淘汰時再排序,也可以即時排序),cpu消耗比lru要高。

兩種常見的快取淘汰演算法LFU LRU

1.lfu 1.1.原理 lfu least frequently used 演算法根據資料的歷史訪問頻率來淘汰資料,其核心思想是 如果資料過去被訪問多次,那麼將來被訪問的頻率也更高 1.2.實現 lfu的每個資料塊都有乙個引用計數,所有資料塊按照引用計數排序,具有相同引用計數的資料塊則按照時間排序...

兩種快取淘汰演算法LFU LRU

lru全稱是least recently used,即最近最久未使用的意思。1.用乙個陣列來儲存資料,給每乙個資料項標記乙個訪問時間戳,每次插入新資料項的時候,先把陣列中存在的資料項的時間戳自增,並將新資料項的時間戳置為0並插入到陣列中。每次訪問陣列中的資料項的時候,將被訪問的資料項的時間戳置為0。...

XML的兩種常見格式

寫了好長時間感覺sax解析也不難理解,主要是xml文件的格式我們不熟悉,熟悉了xml文件的格式,再來看sax解析就好多了 所以寫了這篇關於xml文件常見的兩種格式的詳細解讀 先來模擬一下兩種格式 xml第一種形式 此時我們需要解析的是元素 元素屬性 下面是nsparser的幾個 方法,給出列印結果,...