什么是緩存的雪崩現(xiàn)象
緩存雪崩一般是由某個緩存節(jié)點失效,導(dǎo)致其他節(jié)點的緩存命中率下降,緩存中缺失的數(shù)據(jù)(memcache經(jīng)典場景,當(dāng)有一個客戶端的服務(wù)請求過來的時候,首先去查memcache,memcache里面是否緩存過了這個數(shù)據(jù),如果沒有這個數(shù)據(jù),我們就去數(shù)據(jù)庫查詢,如果有這個數(shù)據(jù),我們就從memcache里面取出來,然后給它返回到客戶端,這是一個經(jīng)典的查詢過程,在這個場景中,緩存中缺失的數(shù)據(jù),是因為它的緩存節(jié)點失效了,所以缺失的數(shù)據(jù)將去數(shù)據(jù)庫查詢。去數(shù)據(jù)庫查詢.短時間內(nèi),造成數(shù)據(jù)庫服務(wù)器崩潰.
重啟DB,短期又被壓跨,但緩存數(shù)據(jù)也多一些.
DB反復(fù)多次啟動多次,緩存重建完畢,DB才穩(wěn)定運行.
或者,是由于緩存周期性的失效,比如每8小時失效一次,那么每8小時,將有一個請求”峰值”,
嚴(yán)重者甚至?xí)頓B崩潰.

上圖是之前部門的一個緩存的真實現(xiàn)象,具體是這樣的緩存的數(shù)據(jù)設(shè)置成為每8個小時失效一次,導(dǎo)致最終的結(jié)果是每8個小時數(shù)據(jù)庫的壓力就變大一次,每8個小時我們的數(shù)據(jù)庫就會迎來一次請求的高峰,因為之前設(shè)置的緩存已經(jīng)失效了。最終導(dǎo)致數(shù)據(jù)庫的壓力變得非常大。
有什么好的解決方案
這個沒有完美解決辦法,但可以分析用戶行為,盡量讓失效時間點均勻分布。不用把時間都設(shè)置成8小時一次,可以把里面的數(shù)據(jù)隨機分布,比如設(shè)置成3—8小時隨機的失效,就不會導(dǎo)致數(shù)據(jù)庫的壓力變得非常大。
即可以這樣:
在緩存失效后,通過加鎖或者隊列來控制讀數(shù)據(jù)庫寫緩存的線程數(shù)量。比如對某個key只允許一個線程查詢數(shù)據(jù)和寫緩存,其他線程等待。 不同的key,設(shè)置不同的過期時間,讓緩存失效的時間點盡量均勻。 做二級緩存,A1為原始緩存,A2為拷貝緩存,A1失效時,可以訪問A2,A1緩存失效時間設(shè)置為短期,A2設(shè)置為長期,變相使緩存時間均勻一些。
文章來源:麥子學(xué)院