LRU在MySQL快取池的實現

2022-03-30 05:00:53 字數 792 閱讀 8333

mysql的innodb引擎設定有索引及資料快取池,其中用到的lru演算法來維持快取的命中率

這裡用到了順序表list來作為緩衝池,每個資料節點稱為block

該演算法採用「中點插入法」:當插入乙個新block時,移除表尾最近最少使用的block,在中點插入新block。

這個中點將鍊錶分為兩部分:

1.靠近表頭的一部分,為young區,這裡的block是最近使用的節點

2.靠近表尾的一部分,為old區,這裡的block是最近少使用的

該演算法通過鍊錶中的block的使用熱度來維持各block的位置,其中old區的block為鍊錶滿的時候移除的候選區

具體演算法如下:

1.鍊錶的3/8被設定為old區

2.中點不是鍊錶的中間點,而是old區的表頭節點,即old區與young區的相鄰的那個節點

3.當讀取的資料不在緩衝池裡的時候,讀取到的block需要插入到鍊錶中,插入點為中點,但是插入的新節點為old區的節點,如果此時old區滿了得話,移除表尾的block(lru節點)

4.當讀取old區的block時,該節點將變成「young」節點:此節點移動到young區的表頭(young區的頭部那裡)

5.在資料庫操作中,被訪問的節點將移除到young的表頭,這樣一來,在young區中的未被訪問的節點將逐漸往表尾移動,當移動過中點,將變為old區的節點。而old區的節點若被訪問到將變為young節點移動到表頭,而old區中的為被訪問的節點依舊往表尾移動,當表滿時,表尾那個block將會被淘汰掉

這裡不涉及到具體**實現,只是簡單講了下原理,待實現出來後再貼上來

謝謝合作

mysql lru LRU在MySQL快取池的實現

mysql的innodb引擎設定有索引及資料快取池,其中用到的lru演算法來維持快取的命中率 這裡用到了順序表list來作為緩衝池,每個資料節點稱為block 該演算法採用 中點插入法 當插入乙個新block時,移除表尾最近最少使用的block,在中點插入新block。這個中點將鍊錶分為兩部分 1....

Lru快取的簡單實現

最近最少使用演算法設計的map快取 使用linkedhashmap特性,完成當快取超過指定容量時,擠掉最久未使用的資源。具體編寫的工具類如下 一 cache類 繼承linkedhashmap 用於儲存資料 class cache extends linkedhashmap 取得元素耗費儲存空間大小 ...

LRU快取的js實現

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