LRU快取淘汰學習

2021-10-13 07:27:17 字數 1653 閱讀 6161

lru (least reacently used),最近最少使用,一種快取淘汰策略

linkedhashmap、資料庫連線池、redis、cup快取記憶體

取長時間內沒有訪問的淘汰,佇列的形式,當重新訪問時則會挪到佇列頭部,當空間不足時從尾部開始刪除,如圖:

想要實現這個效果,首先要有排序,用順序/時間戳等形式記錄訪問順序

不考慮時間複雜度的話,二維陣列/鍊錶可以做到

陣列每訪問一次就要修改資料,維護成本高,時間複雜度為o(n)

鍊錶插入刪除快,但是查詢慢,查詢的時間複雜度為o(n)

這兩種方案在實際生產中是不可接受的

所以一般lru會選用,hashmap+雙向鍊錶(即linkedhashmap)

hashmap使用鍵查詢,直接根據hash值查詢出節點位置,查詢速度快,但是hashmap是無序的

link插入與刪除只需要修改前後節點資訊,所以查詢修改速度快,但查詢的時候需要遍歷,所以查詢速度慢

故而,將link的結點資訊放在hashmap的value裡,將兩者優點結合起來

刪除時,同樣刪除hahsmap與link中的資料

修改時修改link中節點資訊即可,再切換到link頭結點位置

public

class

lruextends

hashmap

//插入鍊錶節點(頭插)

public

void

addnode

(node node)

//刪除指定節點

public

void

removenode

(node node)

//如果不是尾節點

else

}}

訪問時,根據hashmap的get方法訪問節點的hash值,根據value直接訪問雙向鍊錶的某個節點,獲取需要訪問的資料,所以查詢過程時間複雜度為o(1)

//訪問

public object getlur(object key)

return e;

}

新增時,在hashmap中增加乙個,然後在link的頭結點位置增加乙個節點,用value+節點資訊將兩個資料結構對應起來,新增結束。這個過程的時間複雜度為o(1)

//新增

public

void

setlur

(object key,object value)

}else

}//將節點放值煉表頭結點,先刪後插

public

void

puttohead

(node node)

lru原理和redis實現

lru演算法四種實現方式介紹

快取淘汰演算法 LRU

1.lru 1.1.原理 lru least recently used,最近最少使用 演算法根據資料的歷史訪問記錄來進行淘汰資料,其核心思想是 如果資料最近被訪問過,那麼將來被訪問的機率也更高 1.2.實現 最常見的實現是使用乙個鍊錶儲存快取資料,詳細演算法實現如下 1.新資料插入到鍊錶頭部 2....

LRU 快取淘汰演算法

1.介紹 lru是leastrecentlyused近期最少使用演算法。記憶體管理的一種頁面置換演算法,對於在記憶體中但又不用的資料塊 記憶體塊 叫做lru,oracle會根據哪些資料屬於lru而將其移出記憶體而騰出空間來載入另外的資料。lru least recently used,最近最少使用 ...

LRU快取淘汰演算法

這是乙個什麼演算法?這是乙個可以處理程式過多的情況下該刪除哪乙個程式的演算法策略。它是根據最近使用時間來進行確定的,通常刪除的是最後乙個節點。那麼這個演算法會涉及什麼樣的資料結構?這個演算法涉及了hashmap和雙向鍊錶的資料結構,通過這兩個結構的配合可以通過map來快速定位訪問節點,通過雙向鍊錶來...