緩存雪崩
指的短時(shí)間內(nèi),大量緩存數(shù)據(jù)過期逐出逗鸣,還沒有從新加載到緩存中時(shí)合住,流量全部打到數(shù)據(jù)庫(kù)上,導(dǎo)致數(shù)據(jù)庫(kù)負(fù)載飆升撒璧,導(dǎo)致數(shù)據(jù)庫(kù)壓力過大甚至被壓垮的場(chǎng)景透葛。
我們使用緩存的目的,一是提升接口查詢性能卿樱,二是降低數(shù)據(jù)庫(kù)壓力僚害。
很明顯,在緩存雪崩場(chǎng)景下這二者不但沒有解決繁调,反而成了服務(wù)最致命問題萨蚕。
解決辦法
-
請(qǐng)求加鎖
造成數(shù)據(jù)庫(kù)負(fù)載飆升的主要原因,是緩存失效蹄胰,對(duì)同一數(shù)據(jù)的多次訪問全部請(qǐng)求到了數(shù)據(jù)庫(kù)上岳遥,那么這時(shí)候一旦從緩存中拿不到數(shù)據(jù),就對(duì)此行數(shù)據(jù)加鎖裕寨,保證同時(shí)只有一個(gè)請(qǐng)求訪問數(shù)據(jù)庫(kù)浩蓉,而后將數(shù)據(jù)再加載到緩存派继。這樣相同的請(qǐng)求也不會(huì)對(duì)數(shù)據(jù)庫(kù)造成多次訪問。
但是捻艳,服務(wù)中驾窟,任何加鎖的方法,都應(yīng)當(dāng)只能是最終的方案认轨,任何加鎖的解決辦法都不是一個(gè)好的辦法绅络。因?yàn)榧渔i,將請(qǐng)求同步處理嘁字,導(dǎo)致服務(wù)的性能下降恩急;并且加鎖也是一個(gè)十分消耗資源的事。
-
過期設(shè)置
緩存數(shù)據(jù)的過期時(shí)間拳锚,不要都設(shè)置在同一時(shí)間節(jié)點(diǎn)上假栓,否則在這個(gè)時(shí)間節(jié)點(diǎn),會(huì)有海量數(shù)據(jù)過期逐出霍掺。過期時(shí)間的設(shè)置應(yīng)當(dāng)盡量平滑匾荆。
-
熱點(diǎn)數(shù)據(jù)
設(shè)置熱點(diǎn)數(shù)據(jù)永不過期,這些熱點(diǎn)數(shù)據(jù)可能會(huì)占到所有請(qǐng)求流量的絕大部分杆烁。
設(shè)置熱點(diǎn)數(shù)據(jù)在分布式緩存中分布盡量均勻牙丽。
-
降級(jí)處理
設(shè)置多重緩存,緩存降級(jí)兔魂。
緩存穿透
指的是查詢的數(shù)據(jù)數(shù)據(jù)庫(kù)中不存在烤芦,也就不會(huì)加載到緩存中,導(dǎo)致每次查詢都會(huì)請(qǐng)求到數(shù)據(jù)庫(kù)析校。
-
布隆過濾
利用布隆過濾的特性构罗,將不為空的數(shù)據(jù)放到過濾器中,過濾出一定不存在的記錄智玻,這類數(shù)據(jù)就直接返回空值遂唧。
有局限性,比如有些數(shù)據(jù)可以在為空和不為空之間切換吊奢,而布隆過濾器無法剔除數(shù)據(jù)盖彭。
-
對(duì)空緩存
可以對(duì)空值進(jìn)行緩存。
-
空值標(biāo)記
使用其他標(biāo)記位页滚,標(biāo)記此行記錄是否存在召边。
緩存擊穿
指的是熱點(diǎn)數(shù)據(jù)在更新數(shù)據(jù)、刷新緩存或者緩存過期的一瞬間猶豫緩存失效裹驰,導(dǎo)致海量流量請(qǐng)求到數(shù)據(jù)庫(kù)隧熙。
-
請(qǐng)求加鎖
一旦從緩存中拿不到數(shù)據(jù),就對(duì)此行數(shù)據(jù)加鎖邦马,保證同時(shí)只有一個(gè)請(qǐng)求訪問數(shù)據(jù)庫(kù)贱鼻,而后將數(shù)據(jù)再加載到緩存宴卖。這樣相同的請(qǐng)求也不會(huì)對(duì)數(shù)據(jù)庫(kù)造成多次訪問滋将。
-
熱點(diǎn)數(shù)據(jù)異步刷新邻悬、永不過期
使用copyOnWrite思想,當(dāng)新緩存完全準(zhǔn)備好再提供查詢随闽,在這期間都返回老數(shù)據(jù)父丰。