一. 緩存雪崩
“雪崩來臨的時(shí)候沒有一片雪花是無辜的”。緩存雪崩就是大范圍甚至于整個(gè)redis提供的緩存服務(wù)不可用了,進(jìn)而導(dǎo)致所有的請求都直接到了數(shù)據(jù)庫,甚至于擊垮整個(gè)服務(wù)鏈路。造成整個(gè)服務(wù)不可用。
出現(xiàn)原因:
給緩存設(shè)置了過期時(shí)間,且大范圍的緩存數(shù)據(jù)的過期時(shí)間一致。
redis服務(wù)宕機(jī)。
解決方案:
提前預(yù)案: 給redis過期時(shí)間加隨機(jī)值預(yù)防大面積的緩存同時(shí)過期失效。redis集群高可用可用,哨兵機(jī)制。
兜底方案: 服務(wù)熔斷,服務(wù)降級(jí)。監(jiān)控到緩存服務(wù)不可用時(shí)直接返回,或者限制流量直接請求到數(shù)據(jù)庫層。
二. 緩存擊穿
相交于緩存雪崩大范圍或整體緩存不可用緩存擊穿則是指某個(gè)熱點(diǎn)key過期,導(dǎo)致的緩存失效。常常是一部分熱點(diǎn)數(shù)據(jù),如秒殺產(chǎn)品的庫存數(shù)據(jù)。
出現(xiàn)原因:熱點(diǎn)數(shù)據(jù)過期,或者被其他手段刪除。
解決方案:
對于熱點(diǎn)數(shù)據(jù)緩存時(shí)不設(shè)置過期時(shí)間。
第一個(gè)請求發(fā)現(xiàn)熱點(diǎn)數(shù)據(jù)不在redis緩存中,可以先阻塞其他請求,等到第一個(gè)請求將數(shù)據(jù)庫數(shù)據(jù)讀出來并緩存到redis后再喚醒其他請求從緩存服務(wù)中讀取熱點(diǎn)數(shù)據(jù)。
三. 緩存穿透
緩存穿透則是另外一個(gè)層面,指的時(shí)請求所訪問的數(shù)據(jù)既不在緩存中,也不在數(shù)據(jù)庫中。如果應(yīng)用持續(xù)有大量請求訪問數(shù)據(jù),就會(huì)同時(shí)給緩存和數(shù)據(jù)庫帶來巨大壓力。
出現(xiàn)原因:
業(yè)務(wù)層誤操作訪問到了不會(huì)存在的數(shù)據(jù)。
惡意請求攻擊
解決方案:
第一個(gè)請求發(fā)現(xiàn)熱點(diǎn)數(shù)據(jù)不在redis緩存中和數(shù)據(jù)庫中,可以先阻塞其他請求,緩存一個(gè)缺省值返回。
利用redis提供的布隆過濾器。
前端有效值校驗(yàn)。
四. 總結(jié)
緩存雪崩 ,緩存擊穿 均屬于緩存失效的一種異常緩存雪崩影響范圍大于緩存擊穿。緩存穿透 則是數(shù)據(jù)本身就不在在整個(gè)數(shù)據(jù)存儲(chǔ)層。