更新時(shí)間:2023-03-09 來(lái)源:黑馬程序員 瀏覽量:
緩存穿透(Cache Penetration)指的是查詢(xún)一個(gè)不存在的數(shù)據(jù),由于緩存沒(méi)有命中,請(qǐng)求會(huì)直接穿透到數(shù)據(jù)庫(kù),導(dǎo)致數(shù)據(jù)庫(kù)壓力過(guò)大,甚至可能造成宕機(jī)。
緩存擊穿(Cache Miss)指的是某一個(gè)熱點(diǎn)key在緩存中過(guò)期或者被清除,此時(shí)大量請(qǐng)求涌入,由于緩存中沒(méi)有該key的緩存數(shù)據(jù),請(qǐng)求會(huì)直接穿透到數(shù)據(jù)庫(kù),導(dǎo)致數(shù)據(jù)庫(kù)壓力過(guò)大,甚至可能造成宕機(jī)。
緩存雪崩(Cache Avalanche)指的是緩存中大量的數(shù)據(jù)在同一時(shí)間過(guò)期失效,導(dǎo)致大量的請(qǐng)求涌入數(shù)據(jù)庫(kù),導(dǎo)致數(shù)據(jù)庫(kù)壓力過(guò)大,甚至可能造成宕機(jī)。
以下是針對(duì)這三種情況的解決方法:
·在應(yīng)用程序中添加合適的校驗(yàn)機(jī)制,過(guò)濾掉不存在的key,如將所有請(qǐng)求數(shù)據(jù)的唯一標(biāo)識(shí)符(如id)通過(guò)一個(gè)哈希函數(shù)映射為一個(gè)固定的字符串,并判斷字符串是否合法。
·對(duì)于查詢(xún)結(jié)果為空的情況,可以將其緩存到緩存中,但是有效期較短,比如5分鐘,防止惡意攻擊。
·使用互斥鎖或分布式鎖,防止大量請(qǐng)求同時(shí)訪問(wèn)數(shù)據(jù)庫(kù)。
·使用熱點(diǎn)數(shù)據(jù)預(yù)加載,即在緩存過(guò)期之前,提前異步地加載數(shù)據(jù),確保緩存一直有數(shù)據(jù)。
·使用不同的過(guò)期時(shí)間,避免大量的數(shù)據(jù)在同一時(shí)間過(guò)期失效。
·使用緩存的異步刷新機(jī)制,保證緩存中的數(shù)據(jù)不會(huì)同時(shí)過(guò)期失效。
·使用多級(jí)緩存,如本地緩存、分布式緩存和全局緩存,使得緩存的失效不會(huì)同時(shí)影響所有緩存節(jié)點(diǎn)。