緩存雪崩&緩存擊穿&緩存穿透的本質(zhì)
緩存雪崩
什么是緩存雪崩?
大量請(qǐng)求無法在緩存中命中,請(qǐng)求達(dá)到數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫壓力增加,進(jìn)而引起存儲(chǔ)服務(wù)故障,引起雪崩。
為什么會(huì)出現(xiàn)緩存雪崩?
請(qǐng)求中大量數(shù)據(jù)同時(shí)過期,導(dǎo)致大量請(qǐng)求無法命中。
怎么解決?
微調(diào)過期時(shí)間,避免給大量緩存項(xiàng)設(shè)置相同過期時(shí)間,可以采用增加隨機(jī)過期時(shí)間,將大量數(shù)據(jù)過期時(shí)間分開。
設(shè)置多級(jí)緩存,針對(duì)于可能發(fā)生緩存雪崩的數(shù)據(jù)采用不同的多級(jí)緩存處理,如是核心數(shù)據(jù),允許查詢緩存,未命中則查詢數(shù)據(jù)庫;如查詢的不是核心數(shù)據(jù),暫停從緩存中查詢,直接返回預(yù)定義的默認(rèn)值。
另一種導(dǎo)致緩存雪崩的情況是,緩存實(shí)例故障宕機(jī),導(dǎo)致無法處理請(qǐng)求,從而把大量請(qǐng)求打到數(shù)據(jù)庫,增加數(shù)據(jù)庫壓力。
怎么解決?
業(yè)務(wù)服務(wù)中針對(duì)于讀服務(wù)設(shè)置服務(wù)降級(jí)/熔斷/限流機(jī)制,監(jiān)控redis緩存所在機(jī)器的負(fù)載指標(biāo),如發(fā)現(xiàn)redis緩存實(shí)例宕機(jī),數(shù)據(jù)庫負(fù)載壓力突然增加發(fā)生雪崩風(fēng)險(xiǎn),則立即啟動(dòng)服務(wù)熔斷機(jī)制,暫停業(yè)務(wù)系統(tǒng)對(duì)緩存對(duì)訪問,但是有損的。
或者業(yè)務(wù)系統(tǒng)在服務(wù)入口進(jìn)行請(qǐng)求限流。
事前進(jìn)行容量規(guī)劃,搭建redis集群,實(shí)現(xiàn)集群高可用。
緩存擊穿
什么是緩存擊穿?
指的是緩存中無法處理頻繁的熱點(diǎn)數(shù)據(jù),導(dǎo)致大量請(qǐng)求打到數(shù)據(jù)庫,造成數(shù)據(jù)庫壓力,和緩存穿透的區(qū)別在于這個(gè)是熱點(diǎn)key。
為什么會(huì)出現(xiàn)緩存擊穿?
熱點(diǎn)數(shù)據(jù)且數(shù)據(jù)過期失效。
怎么解決?
因?yàn)榫彺娲┩甘且驗(yàn)槟硞€(gè)熱點(diǎn)key既不在緩存中,也不再數(shù)據(jù)庫中,這樣的請(qǐng)求勢(shì)必不能通過緩存分擔(dān)qps壓力,如果持續(xù)有這樣的請(qǐng)求勢(shì)必會(huì)給緩存實(shí)例和數(shù)據(jù)庫帶來壓力。
出現(xiàn)此類問題的原因可能是業(yè)務(wù)層導(dǎo)致,比如一個(gè)正常的緩存key被在緩存和數(shù)據(jù)庫誤刪除了,導(dǎo)致緩存和數(shù)據(jù)庫都沒有這個(gè)緩存key了。
或是由于惡意攻擊,某個(gè)不存在的key。
解決方式可以設(shè)置一個(gè)默認(rèn)的返回值。
或是采用布隆過濾器,判斷查詢數(shù)據(jù)是否存在,避免去數(shù)據(jù)庫查詢數(shù)據(jù),從而減輕數(shù)據(jù)庫壓力。
最好的一種方式就是在業(yè)務(wù)層對(duì)請(qǐng)求參數(shù)的合法性進(jìn)行校驗(yàn)。
一張圖總結(jié)

