有效提高命中率的緩存設計


最近在做網站應用的優化那自然就涉及到緩存方面的處理,實際應用中不可能針對所有數據進行緩存,所以那些數據要優先緩存則變得非常重要.在.net提供一些緩存功能如緩存多長時間或依賴性緩存,但這種緩存方式都很有局限制,並不能達到緩存高命中率的數據.為了實現這點在開始設計緩存的時候采用了LRU算法.

這種算法的主要作用是保存最近使用的數據,可以簡單地使用一個雙向鏈接結合哈希表來實現.當添加緩存或使用時候把對應的項移至鏈表頭,通過一個計時器對鏈表尾進行掃描,把最后活動的數據進行清除.

但這種設計似乎並不理想也很難達到緩存高命中率的數據,拿用戶登陸為例實際上最后登陸的用戶不一定就是非常活躍的用戶,如小張是網站的活躍用戶有可能他這幾天沒有訪問網站,那通過以上算法就可能一些不活躍把他擠到后面導致從緩存中排除;這樣的結果其實並不是我們想要的,所以緊緊靠簡單LRU算實現很達到以上的需求.  

 經過一段時間的思考在LRU算法的基礎加上是L1,L2,L3的Cache似乎可以很好地解決以上問題.

在原有的基礎划分了多層Cache,每層緩存活躍度不同的數據中,每層都有各自的LRU算法來排除超出容易的緩存數據.第一級的緩存活躍度最高,第三級的緩存活躍度最低.以登陸為例:一般一個用戶登陸后都會在三級緩存區,那是怎樣可以沖到一級去呢,唯一的辦法就是用戶在某層緩存活躍度達到一個數量的同時又沒有被本層LRU算法排除的就會切換到上一層緩存區去.由於每一層都有對應的LRU算法,緩存空間不足的情況會自動清除當前最不活躍的,如二級緩存用戶升級上去時當一級緩空間不足的情況就把最久沒活動的擠出去.

以上設計已經滿足當前需求的需要,具體應用效果還有待完成和最終的使用成效.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM