緩存算法與應用詳解

引言

負載均衡算法與應用詳解中有提到,負載均衡有利於提升集羣服務器的吞吐量、數據並行處理能力、減少用戶響應時間,提升業務可靠性等。但是分佈式緩存集羣的伸縮性不能使用簡單的負載均衡手段來實現。

緩存服務器集羣應用服務器集羣負載均衡的不同點在於:

  • 集羣中所有應用服務器部署的應用都是相同的;
  • 集羣中不同緩存服務器中的緩存數據各不相同;

本文目錄

  • 緩存的定義;
  • 緩存的算法;
  • 緩存的相關問題;
  • 緩存的應用案例;

緩存的定義

緩存是指將數據存儲在相對較高訪問速度的存儲介質中,一方面緩存訪問速度快,可以減少數據訪問的時間,另一方面如果緩存的數據是經過計算處理得到的,那麼被緩存的數據無需重複計算即可直接使用,因此緩存還起到減少計算時間的作用。

緩存的本質是一個內存Hash表;

網站數據訪問通常遵循二八定律,即80%的訪問落在20%的數據上,因此利用Hash表和內存的高速訪問特性,將這20%的數據緩存起來,可很好的改善系統性能,提升數據讀取速度,降低存儲訪問壓力。


緩存算法

LRU算法

LRU全稱是Least Recently Used,即最近最久未使用的意思;

LRU算法的設計原則是:如果一個數據在最近一段時間沒有被訪問到,那麼在將來它被訪問的可能性也很小。也就是說,當限定的空間已存滿數據時,應當把最久沒有被訪問到的數據淘汰。

 

餘數Hash算法

 

一致性Hash算法

 

 


緩存相關問題

使用緩存對提高系統性能有很多好處,但是不合理使用緩存非但不能提高系統的性能,還會成爲系統的累贅,甚至風險。實踐中,緩存濫用的情景屢見不鮮——過分依賴低可用的緩存系統、不恰當地使用緩存的數據訪問特性等。

二八定律(熱點場景)

網站訪問中的二八定律:80%的業務訪問集中在20%的數據上;

對於存在二八訪問規律的Web應用,即存在熱點數據的應用,使用緩存纔有意義,否則盲目使用緩存反而增加服務器的處理複雜性和性能壓力;

緩存使用內存作爲存儲,內存資源寶貴而有限,不可能將所有數據都緩存起來,只能將最新訪問的數據緩存起來,而將歷史數據清理出緩存。如果應用系統訪問數據沒有熱點,不遵循二八定律,即大部分數據訪問並沒有集中在小部分數據上,那麼緩存就沒有意義,因爲大部分數據還沒有被再次訪問就已經被擠出緩存了。

緩存雪崩

緩存是爲提高數據讀取性能的,緩存數據丟失或者緩存不可用不會影響到應用程序的處理——它可以從數據庫直接獲取數據。但是隨着業務的發展,緩存會承擔大部分數據訪問的壓力,數據庫已經習慣了有緩存的日子,所以當緩存服務崩潰時,數據庫會因爲完全不能承受如此大的壓力而宕機,進而導致整個網站不可用。這種情況被稱作緩存雪崩,發生這種故障,甚至不能簡單地重啓緩存服務器和數據庫服務器來恢復網站訪問。

實踐中,有的網站通過緩存熱備等手段提高緩存可用性:當某臺緩存服務器宕機時,將緩存訪問切換到熱備服務器上。但是這種設計顯然有違緩存的初衷,緩存根本就不應該被當做一個可靠的數據源來使用。

通過分佈式緩存服務器集羣,將緩存數據分佈到集羣多臺服務器上可在一定程度上改善緩存的可用性。當一臺緩存服務器宕機的時候,只有部分緩存數據丟失,重新從數據庫加載這部分數據不會對數據庫產生很大影響。

緩存預熱

緩存中存放的是熱點數據,熱點數據又是緩存系統利用LRU(最近最久未用算法)對不斷訪問的數據篩選淘汰出來的,這個過程需要花費較長的時間。新啓動的緩存系統如果沒有任何數據,在重建緩存數據的過程中,系統的性能和數據庫負載都不太好,那麼最好在緩存系統啓動時就把熱點數據加載好,這個緩存預加載手段叫作緩存預熱(warm up)。對於一些元數據如城市地名列表、類目信息,可以在啓動時加載數據庫中全部數據到緩存進行預熱。

緩存穿透

如果因爲不恰當的業務、或者惡意攻擊持續高併發地請求某個不存在的數據,由於緩存沒有保存該數據,所有的請求都會落到數據庫上,會對數據庫造成很大壓力,甚至崩潰。一個簡單的對策是將不存在的數據也緩存起來(其value值爲null)。


緩存的應用案例分析

Redis的內存淘汰機制

Redis的持久化機制

 


參考文獻

  • 《大型網站技術架構 核心原理與案例分析》

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章