天天看點

redis緩存擊穿, 緩存穿透和緩存雪崩解決方案

一、緩存擊穿

1.什麼是緩存擊穿

緩存擊穿也就是說當redis緩存中有一個key是大量請求同時通路的熱點資料,如果突然這個key時間到了,那麼大量的請求在緩存中擷取不到該key,穿過緩存直接來到資料庫導緻資料庫崩潰,這樣因為單個key失效而穿過緩存到資料庫稱為緩存擊穿。

2.怎麼辦,怎麼解決

最簡單粗暴的解決方案就是讓熱點key不設定過期時間,即key一直存在于緩存中,更新時直接覆寫即可。

設定定時任務檢測要過期的key,然後在将要過期的時候重新從資料庫把資料重新整理到緩存中,這樣的方式增加系統複雜度,并且實作複雜。

使用互斥鎖的方案,在緩存中沒有資料去資料庫查詢時加上鎖,讓一個線程去查詢資料庫以及更新緩存,其他線程等待,這樣減小資料庫壓力。

二、緩存雪崩

1.什麼是緩存雪崩

為了使查詢速度更快,我們選擇使用緩存來儲存資料,使原本每次請求都需要查詢資料庫的操作變成先查詢緩存,緩存有直接傳回,緩存沒有則查詢資料庫然後再寫入緩存中,通常緩存都是有有效時長的,否則就會一直占用記憶體空間。

當大量請求在通路都會先從緩存查詢,如果此時大部分緩存同時過期失效,那麼這些請求都查詢不到緩存,此時他們會全部将請求到資料庫,當請求數量足夠大時此時将會把資料庫壓垮,這就是緩存雪崩。比如在淩晨十二點搞促銷,大約有10000個使用者發起請求,此時緩存過期,則這10000個請求直接打到資料庫上,把資料庫壓垮,即使重新開機資料庫請求依然會打到資料庫上。

2.怎麼辦,怎麼解決

不設定過期時間,緩存更新直接重新整理。

過期時間上加随機值,避免緩存集中過期。

使用叢集将資料均勻分布在機器上。

采取一定的限流降級機制,防止大量請求搞垮資料庫。

三、緩存穿透

1.什麼是緩存穿透

指當請求查詢緩存和資料庫都不存在的資料時,先查詢緩存為空,再查詢資料庫依然為空,向請求傳回空,如果大量請求同時通路這些不存在key那麼這些請求依然會造成壓垮資料庫的現象,這種通常是惡意查詢和被攻擊幾率較大。

同樣的請求一直出現,會造成壓垮資料庫的現象。

2.怎麼辦,怎麼解決

緩存中存放查詢的key,值設定為空,這樣就能避免請求打到資料庫,但是這樣就會占用緩存空間。

在請求接口處做檢查,如使用者鑒權、參數校驗等,對于不合法的請求直接傳回,這樣能夠攔截部分不合法的請求。

使用布隆過濾器。

總結

緩存雪崩、緩存擊穿、緩存穿透是生産和面試中常見的問題,在請求量小的時候這些問題造成的影響不大,但是一旦通路量大起來這些問題将會造成伺服器當機,甚至在重新開機伺服器之後依然會扛不住壓力繼續當機,隻有提前為資料做好分析準備,選用合适方案進行解決才能夠盡可能的減小生産伺服器損失。

繼續閱讀