程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> LRU在MySQL緩存池的實現

LRU在MySQL緩存池的實現

編輯:MySQL綜合教程

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將會被淘汰掉

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

 

轉載請注明出處:http://www.cnblogs.com/iamsupercp/p/3682659.html 謝謝合作

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved