常見快取演算法和LRU的c 實現

2021-08-02 04:39:49 字數 1433 閱讀 4958

對於web開發而言,快取必不可少,也是提高效能最常用的方式。無論是瀏覽器快取(如果是chrome瀏覽器,可以通過chrome:://cache檢視),還是服務端的快取(通過memcached或者redis等記憶體資料庫)。快取不僅可以加速使用者的訪問,同時也可以降低伺服器的負載和壓力。那麼,了解常見的快取淘汰演算法的策略和原理就顯得特別重要。

像瀏覽器的快取策略、memcached的快取策略都是使用lru這個演算法,lru演算法會將近期最不會訪問的資料淘汰掉。lru如此流行的原因是實現比較簡單,而且對於實際問題也很實用,良好的執行時效能,命中率較高。下面談談如何實現lru快取:

lru cache具備的操作:

lru實現採用雙向鍊錶 + map 來進行實現。這裡採用雙向鍊錶的原因是:如果採用普通的單鏈表,則刪除節點的時候需要從表頭開始遍歷查詢,效率為o(n),採用雙向鍊錶可以直接改變節點的前驅的指標指向進行刪除達到o(1)的效率。使用map來儲存節點的key、value值便於能在o(logn)的時間查詢元素,對應get操作。

雙鏈表節點的定義:

struct cachenode 

};

對於lrucache這個類而言,建構函式需要指定容量大小

lrucache(int capacity)

雙鏈表的節點刪除操作:

void remove(cachenode *node)

else

if (node -> next != null)

else

}

將節點插入到頭部的操作:

void sethead(cachenode *node)

head = node;

if (tail == null)

}

get(key)操作的實現比較簡單,直接通過判斷map是否含有key值即可,如果查詢到key,則返回對應的value,否則返回-1;

int get(int key)

else

}

set(key, value)操作需要分情況判斷。如果當前的key值對應的節點已經存在,則將這個節點取出來,並且刪除節點所處的原有的位置,並在頭部插入該節點;如果節點不存在節點中,這個時候需要在鍊錶的頭部插入新節點,插入新節點可能導致容量溢位,如果出現溢位的情況,則需要刪除鍊錶尾部的節點。

void set(int key, int value)

else

sethead(newnode);

mp[key] = newnode;

}}

至此,lru演算法的實現操作就完成了,完整的原始碼參考:

常見快取演算法和LRU的c 實現

對於web開發而言,快取必不可少,也是提高效能最常用的方式。無論是瀏覽器快取 如果是chrome瀏覽器,可以通過chrome cache檢視 還是服務端的快取 通過memcached或者redis等記憶體資料庫 快取不僅可以加速使用者的訪問,同時也可以降低伺服器的負載和壓力。那麼,了解常見的快取淘汰...

常見快取演算法和LRU的c 實現

對於web開發而言,快取必不可少,也是提高效能最常用的方式。無論是瀏覽器快取 如果是chrome瀏覽器,可以通過chrome cache檢視 還是服務端的快取 通過memcached或者redis等記憶體資料庫 快取不僅可以加速使用者的訪問,同時也可以降低伺服器的負載和壓力。那麼,了解常見的快取淘汰...

C 實現快取演算法LRU和LFU

運用你所掌握的資料結構,設計和實現乙個lru 最近最少使用 快取機制 它應該支援以下操作 獲取資料get和 寫入資料put。獲取資料get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料put key,value 如果金鑰不存在,則寫入其資料值。當快取容量達...