lru(least recently used),最近最少使用。
是一種【記憶體管理】演算法。
lru演算法基於一種假設:
長期不被使用的資料,在未來被用到的機率也不大。因此,當資料所佔記憶體達到一定閾值時,要移除掉最近最少使用的資料。
lru演算法使用了一種有趣的資料結構,叫做【雜湊鍊錶】
1)【雜湊表】是由若干個【key-value】所組成的。
在「邏輯」上,這些key-value是無所謂排列順序的,誰先誰後都一樣。
2) 【雜湊鍊錶】當中,這些【key-value】不再是彼此無關的存在,而是被乙個鏈條串起來了。
每乙個key-value都具有它的前驅key-value、後繼key-value,就像雙向鍊錶中的節點一樣。
這樣一來,原本無序的雜湊表擁有了固定的排列順序。
1、依靠雜湊鍊錶的【有序性】,可以把key-value按照【最後的使用時間】來【排序】
讓我們以使用者資訊的需求為例,來演示一下lru演算法的基本思路:
1.假設我們使用雜湊鍊錶來快取使用者資訊,目前快取了4個使用者,這4個使用者是按照時間順序依次從鍊錶右端插入的。
2.此時,業務方訪問使用者5,由於雜湊鍊錶中沒有使用者5的資料,我們從資料庫中讀取出來,插入到快取當中。
這時候,鍊錶中最右端是最新訪問到的使用者5,最左端是最近最少訪問的使用者1。
3.接下來,業務方訪問使用者2,雜湊鍊錶中存在使用者2的資料,我們怎麼做呢?
我們把使用者2從它的前驅節點和後繼節點之間移除,重新插入到鍊錶最右端。
這時候,鍊錶中最右端變成了最新訪問到的使用者2,最左端仍然是最近最少訪問的使用者1。
4. 接下來,業務方請求修改使用者4的資訊。
同樣道理,我們把使用者4從原來的位置移動到鍊錶最右側,並把使用者資訊的值更新。
這時候,鍊錶中最右端是最新訪問到的使用者4,最左端仍然是最近最少訪問的使用者1。
5 後來業務方換口味了,訪問使用者6,使用者6在快取裡沒有,需要插入到雜湊鍊錶。
假設這時候快取容量已經達到上限,必須先刪除最近最少訪問的資料,那麼位於雜湊鍊錶最左端的使用者1就會被刪除掉,然後再把使用者6插入到 最右端。
以上,就是lru演算法的基本思路。
LRU最近最少淘汰演算法
lru least recently used,最近最少使用 最常的實現就是使用乙個鍊錶來儲存快取資料,最常用在例如 最近閱讀 經常訪問的 等等等!其核心的思想就是 如果資料最近被訪問過,那麼將來被訪問的機率也會更高!上張圖來看下其儲存資料的是想!1.將資料插入到鍊錶的頭部 2 每當快取資料被訪問時...
自適應Lru(最近最少使用)演算法
在快取管理演算法中,lru 幾乎是公認的最優的演算法。然而它也有一些缺陷,主要是因為 它假定對實體的訪問有區域性特性。當訪問模式沒有區域性特性的時候,它就會退化為fifo 先進先出 演算法。在我寫乙個檔案系統的實現時,這種現象很讓我頭疼,因為很多時候,對乙個檔案的訪問大多是順序的,前面讀取過的內容幾...
最近最少使用演算法(LRU) 頁面置換
原創 還是辣個栗子 現記憶體頁面為 15 31 24 17 18 5 9 26 4 21 部分位址流為 4 31 24 17 18 26 17 5 5 9 31 18 18 21 15 8 頁面 8 為下乙個需要調入進去的頁面,由於記憶體頁面已滿,需要使用lru調出乙個最近未被使用頁面。尋找淘汰頁面...