在之前的文章中簡單描述了一下如何通過LRU結合多層緩存機制實現高命中的緩存,這一章節里的主要內容是深入地了解其原理的實現.
LRU算法
什么是LRU算法? LRU是Least Recently Used的縮寫,即最少使用頁面置換算法,是為虛擬頁式存儲管理服務的.通過這種算法可以把最近使用的數據遷移到數據存儲的熱區,而不常用的數據則遷到數據存儲的冷區;通過數據存儲分區那在清除局部冷區數據相應要處理的復雜底就會降低.在.NET中可以通過一個雙向鏈表來實現冷熱交互的結構,大概結構如下:
以上是一個基於雙向鏈表存儲的原理,新添加進來的數據會添加到頭部,當數據被獲取命中后同樣也會移至到鏈表頭,這樣就能形成一個上面的熱數據而下面的冷數據的存儲結構體.基於這種結構我們可以在添加的時候如果存儲容間不足就可以把尾部的項移走,在移除超時項時也只需要從底部開始檢測這樣可以做以最少復雜度的情況把已經超時的數據刪除.
層次提升
在之前的文章里已經提到,只有LRU是滿足不了命中率的需求.LRU只以保證最新的數據存儲在熱區,訪問低的數據存儲在冷區.但在實際應用中熱區的數據並不代表中率就很高;因此為了滿足存儲命中率的需要就要加入類似於CPU中多級緩存區的機制原理.
通過以上划分層次可以把不同命中率的數據存放到不同的緩存區,命中率最高的存放在最頂層,依次往下存儲命中最低的存儲到最低層.而應用處理則從最頂層開始檢索,保證最快獲取命中高的數據.
既然有了不同命中的存儲區,那剩的工作就是如何把當前數據在這些區域中切換,其實現原理可以采用很簡單的方法就是當一個緩存項在某個區中被獲取的次數達到一定數據而又沒有被當前區排除那就可以提升其命中率的級別.