python實現LRU快取淘汰

2021-10-07 10:22:13 字數 1612 閱讀 1184

lru

least recent used 最近最少使用演算法,主要用於快取淘汰.

主要目的就是把最近最少使用的資料移除記憶體,以載入其他資料

原理:

有新資料(意味著資料之前沒有被快取過)時,加入到列表頭

快取達到最大容量時, 需要淘汰資料多出來的資料,此時淘汰列表尾部的資料

當快取中有資料被命中, 則將資料移動到列表頭部(相當於新加入快取)

從前面的文章中我們可以知道,快取簡化下來就兩個功能,乙個是往裡裝資料(快取資料),乙個是往外吐資料(命中快取),所以我們的快取對外只需要put和get兩個介面就可以了。

快取內部我們只需要有乙個列表(list)就可以實現lru邏輯,不過用列表雖然能實現邏輯,但是在判斷是否命中快取時,速度可能非常慢(列表需要遍歷才能知道資料有沒有在裡面)。在python中,我們可以用基於hash的結構,比如字典(dict)或集合(set),來快速判斷資料是否存在,解決列表實現的效能問題。但是字典(python3.6後有序)和集合又是沒有順序的,如果能有一種既能排序,又是基於hash儲存的資料結構,就好了。

在python的collections包中,已經內建了這種實用的結構ordereddict,ordereddict是dict的子類,但是儲存在內部的元素是有序的(列表的特點)。

from collections import ordereddict

class

lrucache

:def

__init__

(self, capacity)

: self.capacity = capacity

self.queue = ordereddict(

)def

get(self, key)

:# 要找的資料不再快取中返回-1

if key not

in self.queue:

return-1

# 將命中快取的資料移除

value = self.queue.pop(key)

# 假定字典最後乙個元素是頭

# 將命中快取的資料重新新增到頭部

self.queue[key]

= value

return self.queue[key]

defput

(self, key, value)

:# 如果已經在快取中, 則先移除老的資料

if key in self.queue:

self.queue.pop(key)

# 如果不在快取中並且達到最大容量, 則把最後的資料淘汰

elif

len(self.queue.items())

== self.capacity:

# 將字典開始的元素淘汰

self.queue.popitem(last=

false

)# 將新資料新增到頭部

self.queue[key]

= value

Swift實現LRU快取淘汰演算法

lru least recently used,最近最少使用 使用的資料結構 鍊錶,雜湊表 使用的程式語言 swift 當有新資料時,先從頭開始遍歷鍊錶 如果資料沒在快取中,再次分為兩種情況 如果快取空間已滿 此次練習實現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,最近最少使用 ...