資料結構系列之LRU演算法理論篇

深夜程猿發表於2019-03-30

更多文章,歡迎關注微信公眾號:深夜程猿

資料結構系列之LRU演算法理論篇

什麼是LRU演算法

LRU演算法中文名叫“最近最少使用”,是一種資料快取淘汰演算法,可以實現基於磁碟和記憶體的快取淘汰

演算法原理

LRU演算法根據資料的歷史使用記錄來進行資料淘汰。LRU演算法認為,最近被使用過的資料,那麼將來會更多的被使用。LRU實現資料淘汰的原理就是當資料快取達到預設的最大值時,就會淘汰最久未被使用的資料。

使用場景

LRU演算法適用於需要經常訪問某些熱資料,並且大部分資料都會被重複訪問的場景

LRU演算法實現方式

基於陣列

使用陣列實現LRU演算法的基本過程如下:

  • 陣列每一個元素都存有資料和資料標記項。資料標記項是用來識別資料最近被使用的時間。
  • 新增一個資料時,會把所有資料的標記項自增,新增的資料標記項設定為0,如果陣列中存在該資料,則設定該資料標記項為0即可,不用新增資料。但陣列達到最大預設儲存空間時,則刪除呼叫資料標記項最大的資料
  • 由於刪除資料的操作,涉及到資料的遷移,效率比較低。所以,如果存在資料經常沒有被快取命中時,LRU演算法很低效
基於單連結串列

使用單連結串列實現LRU演算法基本過程如下:

  • 新增資料時,先判斷連結串列中是否快取有該資料,如果沒有則把該資料放在頭結點,如果存在則把該資料移動到頭結點
  • 新增完資料後,接著判斷連結串列資料是是否超出最大值,是的話就把連結串列尾部的資料刪除掉
  • 每次新增一條資料時,都會進行一次連結串列遍歷,最壞情況是連結串列達到最大值n,需要遍歷n次。相對於結點遍歷,修改資料結點指標指向的時間可以忽略不計。刪除資料時,也會進行一次連結串列全遍歷,最壞情況時遍歷n次。所以,尋找一個資料是否在快取中的最壞情況也是遍歷n次。所以,使用單連結串列實現LRU演算法的時間複雜度和連結串列時間複雜度一樣,為O(n)
LRU演算法優缺點
  • 優點

當存在熱點資料時,並且這些大部分資料還是經常被使用的,LRU命中率較高,不需要經常進行資料的新增和刪除

  • 缺點

如果只有很少的資料被經常使用,LRU演算法很低效。因為LRU命中率很低,經常需要淘汰資料。也就是“快取汙染”問題,快取的資料並沒有很大程度上重複使用

LRU-K演算法

LRU-K演算法是為了解決LRU演算法的“快取汙染”問題。可以認為,LRU演算法就是LRU-1演算法。LRU-K演算法目的就是把LRU演算法的“最近一次被使用”賦能為“最近K次被使用”。

LRU-K演算法原理

LRU-K演算法相比於LRU(LRU-1)演算法,LRU-K演算法一開始不會真正快取資料,只有資料被使用過了K次才會放入快取之中。那麼,在資料沒有被真正快取之前,資料放在哪裡的呢?如何記錄使用次數的呢?LRU-K演算法會多維護一個佇列,用於儲存資料的使用記錄。但佇列中的資料使用達到K次就取出來放進快取。淘汰快取資料和LRU(LRU-1)原理一樣,第K次使用時間最早的先淘汰。

雙佇列模式LRU

雙佇列LRU演算法,使用FIFO佇列和LRU佇列快取資料。和LRU-K不同的是,雙佇列LRU演算法兩個佇列都快取資料,LRU-K演算法只使用一個快取佇列快取資料,一個佇列記錄資料使用情況

多佇列模式LRU

多佇列模式LRU的原理是使用多個佇列,按照資料不同的使用頻率來快取資料,也就是多優先順序快取。命中的資料會逐漸從低優先順序佇列快取到高優先順序佇列。高優先順序佇列的資料會逐漸從淘汰到低優先順序佇列,最後真正被淘汰

系列文章

資料結構小白系列之資料結構概述

相關文章