1. 程式人生 > >LRU最近最少淘汰演算法

LRU最近最少淘汰演算法

 LRU (Least recently used,最近最少使用)

最常的實現就是使用一個連結串列來儲存快取資料,最常用在例如:

  最近閱讀:。。。。

    。。。。

    。。。。

  經常訪問的網站 。。。。

      。。。。

      。。。。

等等等!

其核心的思想就是“如果資料最近被訪問過,那麼將來被訪問的機率也會更高!”

 上張圖來看下其儲存資料的是想!

 
   
   
1.將資料插入到連結串列的頭部

 2 每當快取資料被訪問時(快取命中),則將資料移動到連結串列的頭部

3 當連結串列裝滿的時候,將尾部的資料丟棄!

當資料存在熱點時(也就是有幾條資料頻繁被訪問)LRU的效率很好!但是在偶發性的,週期性的批量操作會導致LRU的命中率急速

下降,快取汙染的情況比較嚴重!


LRU-K

 lru-k中的k代表最近使用的次數!lru-k主要是為了解決lru的汙染快取問題!其核心思想就是講最近使用過1次的資料擴充套件到最近使

用過K次的資料!

 相比之下,LRU-K比LRU多維護一個佇列,用於記錄快取資料被訪問歷史!只有當快取資料達到K次的時候才將資料放入到快取

當中。需要淘汰時,LRU-K會淘汰掉第K次訪問時間距離當前時間最長的資料。

 
1.資料第一次被訪問,加入到訪問歷史列表
  2 如果資料在訪問歷史列表裡面沒有達到K次訪問次數,則按照FIFO進行淘汰 3 當訪問歷史佇列中的資料訪問次數達到K此以後,將資料索引從歷史佇列刪除,將資料移到快取佇列中,並快取此資料,快取佇列重新按照時間排序。 4 快取佇列中的資料被再次訪問後,重新排序 5 需要淘汰資料時,淘汰掉快取佇列中排在末尾的資料,既:淘汰掉快取中訪問時間裡現在最久的資料。LRU-K具有LRU的優點,同時能夠避免LRU的缺點,實際應用中LRU-K時綜合各種因素後的最優選擇,LRU-3或許有更大的K中命中率,但適應性差,需要大量的資料訪問才能將歷史訪問記錄清楚掉!
 
分析:LRU-K
 命中率:LRU-K降低了“快取汙染”帶來的問題,命中率比LRU要高
 複雜度:LRU-K佇列是一個優先順序佇列,演算法複雜度和代價比較高
 代價:由於LRU-K還需要記錄哪些被訪問過,但是還沒有放入快取的物件,因此記憶體消耗會比LRU更多!當資料訪問量很大的時候,記憶體消耗會比較可觀!
LRU-K需要基於時間進行排序(可以需要淘汰時在排序,也可以及時排序)CPU消耗比LRU更高!