lru是least recently used的縮寫,意為最近最少使用演算法。
lrucache是一種常用的快取替換演算法,根據使用率淘汰資料,即使用率最小的會被淘汰,通常會用乙個雙向鍊錶來實現,在這個雙向鍊錶中,如果乙個cache被命中,則將這個資料移動到鍊錶的頭部,而不經常使用的cache就會逐漸移向鍊錶的尾部,我們會給這個鍊錶設定乙個大小作為該雙向鍊錶的最大容量,當鍊表達到最大容量時,就取出鍊錶尾部的乙個資料丟掉。
快取裡存放的一般是鍵值對,就是 key / value的結構,最簡單的lrucache大致有兩種操作:
一種是get(key),這個方法是從快取裡查詢是否有key的元素,有的話返回其value值, 沒有的話返回-1。
一種是set(key, value),這個方法是,若快取裡沒有key的元素,那麼放到快取裡,如果快取已經滿了,將最不常用的那個(key, value)給移除,再把新元素放進去,並插入到鍊錶的頭部(最前面);若快取裡已經有key的元素了,那麼更新key的value值,並將更新後的key / value放到最前面。
雖然上述中已經用鍊錶實現了基本操作,但是也會存在乙個問題:如果直接用雙向鍊錶的話,從快取中取數時每次都需要遍歷鍊錶,這樣就會消耗大量的時間,如果採用map實現鍵值key / value對應,這樣就避免了每次查詢的時候都要在雙向鍊錶中順序遍歷了,很大程度上提高了查詢的效率。
下面是乙個簡單的lrucache的實現:
template
class lrucache
t get(k key)
else
} void set(k key, t value)
else
} else
}private:
struct listnode
}; void cacheinserthead(listnode* node)
void cachedeletenode(listnode* node)
private:
int max_size;
int current_size;
unordered_map
cachemap;
listnode* head;
listnode* tail;
t err_;
};
LRU Cache的簡單c 實現
lru cache是乙個cache的置換演算法,含義是 最近最少使用 把滿足 最近最少使用 的資料從cache中剔除出去,並且保證cache中第乙個資料是最近剛剛訪問的,因為這樣的資料更有可能被接下來的程式所訪問。lru的應用比較廣泛,最基礎的記憶體頁置換中就用了,對了,這裡有個概念要清楚一下,ca...
簡單的LRU Cache設計與實現
要求 設計並實現乙個lru快取的資料結構,支援get和set操作 get key 若快取中存在key,返回對應的value,否則返回 1 set key,value 若快取中存在key,替換其value,否則插入key及其value,如果插入時快取已經滿了,應該使用lru演算法把最近最久沒有使用的k...
LRu Cache演算法原理
lru cache演算法原理 1.新資料插入到鍊錶頭部 2.每當快取命中 即快取資料被訪問 則將資料移到鍊錶頭部 3.當鍊表滿的時候,將鍊錶尾部的資料丟棄。分析 命中率 當存在熱點資料時,lru的效率很好,但偶發性的 週期性的批量操作會導致lru命中率急劇下降,快取汙染情況比較嚴重。複雜度 實現簡單...