天天看點

高性能緩存的幾個問題

在一些特殊場景下,僅僅依靠提升存儲系統性能是不夠的。如:需要經過複雜運算得到的資料;讀多寫少的資料。于是有了緩存,它雖能大大減輕存儲系統的壓力,但也引入了更多的複雜度。

TOP1、緩存穿透

是指緩存沒有發生作用。通常有兩種情況:存儲資料不存在、緩存資料生成耗費大量時間或者資源。目前沒有特别好的解決方案。

TOP2、緩存雪崩(緩存擊穿)

是指緩存失效後引起系統性能急劇下降。解決方法:更新鎖機制、背景更新機制。

TOP3、緩存熱點

是指通路量大的資料。解決方案是複制多份緩存副本,将請求分散到多個緩存伺服器上,減輕緩存熱點導緻的單台緩存伺服器壓力。

這裡列舉兩個緩存穿透的解決方案

1.布隆過濾

  對所有可能查詢的參數以hash形式存儲,在控制層先進行校驗,不符合則丢棄。還有最常見的則是采用布隆過濾器,将所有可能存在的資料哈希到一個足夠大的bitmap中,一個一定不存在的資料會被這個bitmap攔截掉,進而避免了對底層存儲系統的查詢壓力。

  補充:

  Bloom filter

  适用範圍:可以用來實作資料字典,進行資料的判重,或者集合求交集

  基本原理及要點:對于原理來說很簡單,位數組+k個獨立hash函數。将hash函數對應的值的位數組置1,查找時如果發現所有hash函數對應位都是1說明存在,很明顯這個過程并不保證查找的結果是100%正确的。同時也不支援删除一個已經插入的關鍵字,因為該關鍵字對應的位會牽動到其他的關鍵字。是以一個簡單的改進就是counting Bloom filter,用一個counter數組代替位數組,就可以支援删除了。添加時增加計數器,删除時減少計數器。

2.緩存空對象

  也可以采用一個更為簡單粗暴的方法,如果一個查詢傳回的資料為空(不管是數 據不存在,還是系統故障),我們仍然把這個空結果進行緩存,但它的過期時間會很短,最長不超過五分鐘。

 緩存空對象會有兩個問題:

 第一,空值做了緩存,意味着緩存層中存了更多的鍵,需要更多的記憶體空間 ( 如果是攻擊,問題更嚴重 ),比較有效的方法是針對這類資料設定一個較短的過期時間,讓其自動剔除。

 第二,緩存層和存儲層的資料會有一段時間視窗的不一緻,可能會對業務有一定影響。例如過期時間設定為 5分鐘,如果此時存儲層添加了這個資料,那此段時間就會出現緩存層和存儲層資料的不一緻,此時可以利用消息系統或者其他方式清除掉緩存層中的空對象。

繼續閱讀