跳躍學(xué)習(xí)一下 Redis -- 緩存異常問題專題

25 | 緩存異常(上):如何解決緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)不一致問題嘴脾?

1、前言

異常問題蔬墩,4 個(gè)方面:緩存中的數(shù)據(jù)和數(shù)據(jù)庫(kù)中的不一致译打;緩存雪崩緩存擊穿和緩存穿透筹我。

2扶平、緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)不一致是如何發(fā)生的?

“數(shù)據(jù)的一致性”含義:不符合這兩種情況的蔬蕊,就屬于緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)不一致問題结澄。

緩存中有數(shù)據(jù)哥谷,那么,緩存的數(shù)據(jù)值需要和數(shù)據(jù)庫(kù)中的值相同麻献;

緩存中本身沒有數(shù)據(jù)们妥,那么,數(shù)據(jù)庫(kù)中的值必須是最新值勉吻。

根據(jù)是否接收寫請(qǐng)求监婶,我們可以把緩存分成讀寫緩存和只讀緩存。

1)齿桃、對(duì)于讀寫緩存惑惶,如果要對(duì)數(shù)據(jù)進(jìn)行增刪改,就需要在緩存中進(jìn)行短纵,同時(shí)還要根據(jù)采取的寫回策略带污,決定是否同步寫回到數(shù)據(jù)庫(kù)中

同步直寫策略寫緩存時(shí)香到,也同步寫數(shù)據(jù)庫(kù)鱼冀,緩存和數(shù)據(jù)庫(kù)中的數(shù)據(jù)一致

異步寫回策略寫緩存時(shí)不同步寫數(shù)據(jù)庫(kù)悠就,等到數(shù)據(jù)從緩存中淘汰時(shí)千绪,再寫回?cái)?shù)據(jù)庫(kù)。使用這種策略時(shí)梗脾,如果數(shù)據(jù)還沒有寫回?cái)?shù)據(jù)庫(kù)荸型,緩存就發(fā)生了故障,那么藐唠,此時(shí)帆疟,數(shù)據(jù)庫(kù)就沒有最新的數(shù)據(jù)了鹉究。

所以宇立,對(duì)于讀寫緩存,要想保證緩存和數(shù)據(jù)庫(kù)中的數(shù)據(jù)一致自赔,就要采用同步直寫策略妈嘹。(需要同時(shí)更新緩存 + 數(shù)據(jù)庫(kù),要保證事務(wù))

在對(duì)數(shù)據(jù)一致性的要求可能不是那么高绍妨,可以使用異步寫回策略润脸。(比如說(shuō)緩存的是電商商品的非關(guān)鍵屬性或者短視頻的創(chuàng)建或修改時(shí)間等)

2)、對(duì)于只讀緩存他去,如果有數(shù)據(jù)新增毙驯,會(huì)直接寫入數(shù)據(jù)庫(kù);而有數(shù)據(jù)刪改時(shí)灾测,就需要把只讀緩存中的數(shù)據(jù)標(biāo)記為無(wú)效爆价。這樣一來(lái),應(yīng)用后續(xù)再訪問這些增刪改的數(shù)據(jù)時(shí),因?yàn)榫彺嬷袥]有相應(yīng)的數(shù)據(jù)铭段,就會(huì)發(fā)生緩存缺失骤宣。此時(shí),應(yīng)用再?gòu)臄?shù)據(jù)庫(kù)中把數(shù)據(jù)讀入緩存序愚,這樣后續(xù)再訪問數(shù)據(jù)時(shí)憔披,就能夠直接從緩存中讀取了。

以 Tomcat 向 MySQL 中寫入和刪改數(shù)據(jù)為例爸吮,增/刪/改如何進(jìn)行的:

Tomcat 上運(yùn)行的應(yīng)用芬膝,無(wú)論是新增(Insert 操作)、修改(Update 操作)形娇、還是刪除(Delete 操作)數(shù)據(jù) X蔗候,都會(huì)直接在數(shù)據(jù)庫(kù)中增改刪。當(dāng)然埂软,如果應(yīng)用執(zhí)行的是修改或刪除操作锈遥,還會(huì)刪除緩存的數(shù)據(jù) X。

數(shù)據(jù)的增/刪/改操作具體是如何進(jìn)行

A勘畔、新增數(shù)據(jù)

新增數(shù)據(jù)所灸,數(shù)據(jù)會(huì)直接寫到數(shù)據(jù)庫(kù)中,不用對(duì)緩存做任何操作炫七,緩存中本身就沒有新增數(shù)據(jù)爬立,而數(shù)據(jù)庫(kù)中是最新值,這種情況符合我們剛剛所說(shuō)的一致性的第 2 種情況万哪,所以侠驯,此時(shí),緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)是一致的奕巍。

B吟策、刪改數(shù)據(jù)

如果發(fā)生刪改操作,應(yīng)用既要更新數(shù)據(jù)庫(kù)的止,也要在緩存中刪除數(shù)據(jù)檩坚。這兩個(gè)操作如果無(wú)法保證原子性,也就是說(shuō)诅福,要不都完成匾委,要不都沒完成,此時(shí)氓润,就會(huì)出現(xiàn)數(shù)據(jù)不一致問題赂乐。

兩種情況——先操作緩存再操作數(shù)據(jù)庫(kù);先操作數(shù)據(jù)庫(kù)再操作緩存咖气。

先操作緩存再操作數(shù)據(jù)庫(kù)
先操作數(shù)據(jù)庫(kù)再操作緩存

到這挨措,在更新數(shù)據(jù)庫(kù)和刪除緩存值的過(guò)程中辐啄,無(wú)論這兩個(gè)操作的執(zhí)行順序誰(shuí)先誰(shuí)后,只要有一個(gè)操作失敗了运嗜,就會(huì)導(dǎo)致客戶端讀取到舊值壶辜。

無(wú)論誰(shuí)在前都有問題

3、如何解決數(shù)據(jù)不一致問題担租?

有兩種方法:重試機(jī)制砸民;延時(shí)雙刪

1)奋救、重試機(jī)制

把要?jiǎng)h除的緩存值或者是要更新的數(shù)據(jù)庫(kù)值暫存到消息隊(duì)列中岭参。當(dāng)應(yīng)用沒有能夠成功地刪除緩存值或者是更新數(shù)據(jù)庫(kù)值時(shí),可以從消息隊(duì)列中重新讀取這些值尝艘,然后再次進(jìn)行刪除或更新演侯。

如果能夠成功的刪除或更新,需要把這些值從消息隊(duì)列刪除背亥,避免重試秒际。

如果重試一直失敗,到一定次數(shù)狡汉,需要給業(yè)務(wù)層發(fā)送報(bào)錯(cuò)信息娄徊。

重試機(jī)制保證數(shù)據(jù)一致性

2)、延時(shí)雙刪----兩種情況----解決并發(fā)情況下的數(shù)據(jù)不一致問題

情況一:先刪除緩存盾戴,再更新數(shù)據(jù)庫(kù)寄锐。

假設(shè)線程 A 刪除緩存值后,還沒有來(lái)得及更新數(shù)據(jù)庫(kù)(比如說(shuō)有網(wǎng)絡(luò)延遲)尖啡,線程 B 就開始讀取數(shù)據(jù)了橄仆,那么這個(gè)時(shí)候,線程 B 會(huì)發(fā)現(xiàn)緩存缺失衅斩,就只能去數(shù)據(jù)庫(kù)讀取盆顾。這會(huì)帶來(lái)兩個(gè)問題:

--線程 B 讀取到了舊值;

--線程 B 是在緩存缺失的情況下讀取的數(shù)據(jù)庫(kù)矛渴,所以椎扬,它還會(huì)把舊值寫入緩存,這可能會(huì)導(dǎo)致其他線程從緩存中讀到舊值具温。

等到線程 B 從數(shù)據(jù)庫(kù)讀取完數(shù)據(jù)、更新了緩存后筐赔,線程 A 才開始更新數(shù)據(jù)庫(kù)铣猩,此時(shí),緩存中的數(shù)據(jù)是舊值茴丰,而數(shù)據(jù)庫(kù)中的是最新值达皿,兩者就不一致了天吓。

數(shù)據(jù)不一致情況一

解決:延時(shí)雙刪

在線程 A 更新完數(shù)據(jù)庫(kù)值以后,我們可以讓它先 sleep 一小段時(shí)間峦椰,再進(jìn)行一次緩存刪除操作龄寞。

redis.delKey(X)

db.update(X)

Thread.sleep(N)

redis.delKey(X)

之所以要加上 sleep 的這段時(shí)間,就是為了讓線程 B 能夠先從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)汤功,再把缺失的數(shù)據(jù)寫入緩存物邑,然后,線程 A 再進(jìn)行刪除滔金。所以色解,線程 A sleep 的時(shí)間,就需要大于線程 B 讀取數(shù)據(jù)再寫入緩存的時(shí)間餐茵。

這樣一來(lái)科阎,其它線程讀取數(shù)據(jù)時(shí),會(huì)發(fā)現(xiàn)緩存缺失忿族,所以會(huì)從數(shù)據(jù)庫(kù)中讀取最新值锣笨。因?yàn)檫@個(gè)方案會(huì)在第一次刪除緩存值后,延遲一段時(shí)間再次進(jìn)行刪除道批,所以我們也把它叫做“延遲雙刪”票唆。

情況二:先更新數(shù)據(jù)庫(kù)值,再刪除緩存值屹徘。

如果線程 A 刪除了數(shù)據(jù)庫(kù)中的值走趋,但還沒來(lái)得及刪除緩存值,線程 B 就開始讀取數(shù)據(jù)了噪伊,那么此時(shí)簿煌,線程 B 查詢緩存時(shí),發(fā)現(xiàn)緩存命中鉴吹,就會(huì)直接從緩存中讀取舊值姨伟。不過(guò),在這種情況下豆励,如果其他線程并發(fā)讀緩存的請(qǐng)求不多夺荒,那么,就不會(huì)有很多請(qǐng)求讀取到舊值良蒸。而且技扼,線程 A 一般也會(huì)很快刪除緩存值,這樣一來(lái)嫩痰,其他線程再次讀取時(shí)剿吻,就會(huì)發(fā)生緩存缺失,進(jìn)而從數(shù)據(jù)庫(kù)中讀取最新值串纺。所以丽旅,這種情況對(duì)業(yè)務(wù)的影響較小椰棘。

數(shù)據(jù)不一致情況二

總結(jié)一下,緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)不一致一般是由兩個(gè)原因?qū)е麻希鄳?yīng)的解決方案如下

1)邪狞、刪除緩存值或更新數(shù)據(jù)庫(kù)失敗而導(dǎo)致數(shù)據(jù)不一致,你可以使用重試機(jī)制確保刪除或更新操作成功茅撞。

2)帆卓、在刪除緩存值、更新數(shù)據(jù)庫(kù)的這兩步操作中乡翅,有其他線程的并發(fā)讀操作鳞疲,導(dǎo)致其他線程讀取到舊值,應(yīng)對(duì)方案是延遲雙刪蠕蚜。

4尚洽、小結(jié)

緩存和數(shù)據(jù)庫(kù)不一致的問題

1)、對(duì)于讀寫緩存來(lái)說(shuō)靶累,如果我們采用同步寫回策略腺毫,那么可以保證緩存和數(shù)據(jù)庫(kù)中的數(shù)據(jù)一致

2)挣柬、只讀緩存的情況比較復(fù)雜

只讀緩存下的數(shù)據(jù)不一致問題匯總

3)潮酒、小tips:大多數(shù)業(yè)務(wù)場(chǎng)景下,Redis 作為只讀緩存使用

建議:優(yōu)先使用先更新數(shù)據(jù)庫(kù)再刪除緩存的方法邪蛔,原因有二:

A急黎、先刪除緩存值再更新數(shù)據(jù)庫(kù),有可能導(dǎo)致請(qǐng)求因緩存缺失而訪問數(shù)據(jù)庫(kù)侧到,給數(shù)據(jù)庫(kù)帶來(lái)壓力勃教;

B、如果業(yè)務(wù)應(yīng)用中讀取數(shù)據(jù)庫(kù)和寫緩存的時(shí)間不好估算匠抗,那么故源,延遲雙刪中的等待時(shí)間就不好設(shè)置。

當(dāng)使用先更新數(shù)據(jù)庫(kù)再刪除緩存時(shí)汞贸,也有個(gè)地方需要注意绳军,如果業(yè)務(wù)層要求必須讀取一致的數(shù)據(jù),就需要在更新數(shù)據(jù)庫(kù)時(shí)矢腻,先在 Redis 緩存客戶端暫存并發(fā)讀請(qǐng)求艰垂,等數(shù)據(jù)庫(kù)更新完权薯、緩存值刪除后匙握,再讀取數(shù)據(jù)稀轨,從而保證數(shù)據(jù)一致性抹凳。


26 | 緩存異常(下):如何解決緩存雪崩井辜、擊穿修壕、穿透難題钉凌?

1、緩存雪崩

緩存雪崩是指大量的應(yīng)用請(qǐng)求無(wú)法在 Redis 緩存中進(jìn)行處理帐偎,緊接著逐纬,應(yīng)用將大量請(qǐng)求發(fā)送到數(shù)據(jù)庫(kù)層,導(dǎo)致數(shù)據(jù)庫(kù)層的壓力激增削樊。

兩個(gè)原因?qū)е拢?/p>

1)豁生、緩存中有大量數(shù)據(jù)同時(shí)過(guò)期,導(dǎo)致大量請(qǐng)求無(wú)法得到處理漫贞。

2)甸箱、Redis緩存實(shí)例發(fā)生故障宕機(jī)了,無(wú)法處理請(qǐng)求迅脐,這就會(huì)導(dǎo)致大量請(qǐng)求一下子積壓到數(shù)據(jù)庫(kù)層芍殖,從而發(fā)生緩存雪崩

1)、處理方案

A谴蔑、給這些數(shù)據(jù)的過(guò)期時(shí)間增加一個(gè)較小的隨機(jī)數(shù)(隨機(jī)增加 1~3 分鐘)豌骏,避免同時(shí)過(guò)期

B、服務(wù)降級(jí)隐锭,只有部分過(guò)期數(shù)據(jù)的請(qǐng)求會(huì)發(fā)送到數(shù)據(jù)庫(kù)窃躲,數(shù)據(jù)庫(kù)的壓力就沒有那么大了

當(dāng)業(yè)務(wù)應(yīng)用訪問的是非核心數(shù)據(jù)(例如電商商品屬性)時(shí),暫時(shí)停止從緩存中查詢這些數(shù)據(jù)钦睡,而是直接返回預(yù)定義信息蒂窒、空值或是錯(cuò)誤信息;

當(dāng)業(yè)務(wù)應(yīng)用訪問的是核心數(shù)據(jù)(例如電商商品庫(kù)存)時(shí)荞怒,仍然允許查詢緩存洒琢,如果緩存缺失,也可以繼續(xù)通過(guò)數(shù)據(jù)庫(kù)讀取挣输。

緩存雪崩
服務(wù)降級(jí)

2)纬凤、處理方案(緩存處理萬(wàn)億級(jí)別,數(shù)據(jù)庫(kù)處理千萬(wàn)級(jí)別撩嚼,差十倍)

A停士、是在業(yè)務(wù)系統(tǒng)中實(shí)現(xiàn)服務(wù)熔斷或請(qǐng)求限流機(jī)制

服務(wù)熔斷完丽,是指在發(fā)生緩存雪崩時(shí)恋技,為了防止引發(fā)連鎖的數(shù)據(jù)庫(kù)雪崩,甚至是整個(gè)系統(tǒng)的崩潰逻族,我們暫停業(yè)務(wù)應(yīng)用對(duì)緩存系統(tǒng)的接口訪問蜻底。再具體點(diǎn)說(shuō),就是業(yè)務(wù)應(yīng)用調(diào)用緩存接口時(shí)聘鳞,緩存客戶端并不把請(qǐng)求發(fā)給 Redis 緩存實(shí)例薄辅,而是直接返回要拂,等到 Redis 緩存實(shí)例重新恢復(fù)服務(wù)后,再允許應(yīng)用請(qǐng)求發(fā)送到緩存系統(tǒng)站楚。

避免了大量請(qǐng)求因緩存缺失脱惰,而積壓到數(shù)據(jù)庫(kù)系統(tǒng),保證了數(shù)據(jù)庫(kù)系統(tǒng)的正常運(yùn)行窿春。

服務(wù)熔斷

服務(wù)熔斷雖然可以保證數(shù)據(jù)庫(kù)的正常運(yùn)行拉一,但是暫停了整個(gè)緩存系統(tǒng)的訪問,對(duì)業(yè)務(wù)應(yīng)用的影響范圍大旧乞。為了盡可能減少這種影響蔚润,我們也可以進(jìn)行請(qǐng)求限流。請(qǐng)求限流尺栖,是指在業(yè)務(wù)系統(tǒng)的請(qǐng)求入口前端控制每秒進(jìn)入系統(tǒng)的請(qǐng)求數(shù)嫡纠,避免過(guò)多的請(qǐng)求被發(fā)送到數(shù)據(jù)庫(kù)。

服務(wù)限流

B决瞳、事前預(yù)防

通過(guò)主從節(jié)點(diǎn)的方式構(gòu)建 Redis 緩存高可靠集群货徙。如果 Redis 緩存的主節(jié)點(diǎn)故障宕機(jī)了,從節(jié)點(diǎn)還可以切換成為主節(jié)點(diǎn)皮胡,繼續(xù)提供緩存服務(wù)痴颊,避免了由于緩存實(shí)例宕機(jī)而導(dǎo)致的緩存雪崩問題。

2屡贺、緩存擊穿

緩存擊穿是指蠢棱,針對(duì)某個(gè)訪問非常頻繁的熱點(diǎn)數(shù)據(jù)的請(qǐng)求,無(wú)法在緩存中進(jìn)行處理甩栈,緊接著泻仙,訪問該數(shù)據(jù)的大量請(qǐng)求,一下子都發(fā)送到了后端數(shù)據(jù)庫(kù)量没,導(dǎo)致了數(shù)據(jù)庫(kù)壓力激增玉转,會(huì)影響數(shù)據(jù)庫(kù)處理其他請(qǐng)求。緩存擊穿的情況殴蹄,經(jīng)常發(fā)生在熱點(diǎn)數(shù)據(jù)過(guò)期失效究抓。

緩存擊穿

解決方案:對(duì)于訪問特別頻繁的熱點(diǎn)數(shù)據(jù),我們就不設(shè)置過(guò)期時(shí)間袭灯。

3刺下、緩存穿透

緩存穿透是指要訪問的數(shù)據(jù)既不在 Redis 緩存中,也不在數(shù)據(jù)庫(kù)中稽荧,導(dǎo)致請(qǐng)求在訪問緩存時(shí)橘茉,發(fā)生緩存缺失,再去訪問數(shù)據(jù)庫(kù)時(shí),發(fā)現(xiàn)數(shù)據(jù)庫(kù)中也沒有要訪問的數(shù)據(jù)畅卓。

緩存穿透

兩種情況產(chǎn)生:

1)擅腰、業(yè)務(wù)層誤操作:緩存中的數(shù)據(jù)和數(shù)據(jù)庫(kù)中的數(shù)據(jù)被誤刪除了,所以緩存和數(shù)據(jù)庫(kù)中都沒有數(shù)據(jù)髓介;

2)惕鼓、惡意攻擊:專門訪問數(shù)據(jù)庫(kù)中沒有的數(shù)據(jù)筋现。

解決方案:

1)唐础、緩存空值或缺省值。----解決少量

一旦發(fā)生緩存穿透矾飞,我們就可以針對(duì)查詢的數(shù)據(jù)一膨,在 Redis 中緩存一個(gè)空值或是和業(yè)務(wù)層協(xié)商確定的缺省值(例如,庫(kù)存的缺省值可以設(shè)為 0)洒沦,再次請(qǐng)求就可以請(qǐng)求緩存豹绪。

2)、使用布隆過(guò)濾器快速判斷數(shù)據(jù)是否存在申眼,避免從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)是否存在瞒津,減輕數(shù)據(jù)庫(kù)壓力。

布隆過(guò)濾器是如何工作

布隆過(guò)濾器由一個(gè)初值都為 0 的 bit 數(shù)組和 N 個(gè)哈希函數(shù)組成括尸,可以用來(lái)快速判斷某個(gè)數(shù)據(jù)是否存在巷蚪。當(dāng)我們想標(biāo)記某個(gè)數(shù)據(jù)存在時(shí)(例如,數(shù)據(jù)已被寫入數(shù)據(jù)庫(kù))濒翻,布隆過(guò)濾器會(huì)通過(guò)三個(gè)操作完成標(biāo)記:

首先屁柏,使用 N 個(gè)哈希函數(shù),分別計(jì)算這個(gè)數(shù)據(jù)的哈希值有送,得到 N 個(gè)哈希值淌喻。

然后,我們把這 N 個(gè)哈希值對(duì) bit 數(shù)組的長(zhǎng)度取模雀摘,得到每個(gè)哈希值在數(shù)組中的對(duì)應(yīng)位置裸删。

最后,我們把對(duì)應(yīng)位置的 bit 位設(shè)置為 1阵赠,這就完成了在布隆過(guò)濾器中標(biāo)記數(shù)據(jù)的操作涯塔。

如果數(shù)據(jù)不存在(例如,數(shù)據(jù)庫(kù)里沒有寫入數(shù)據(jù))豌注,我們也就沒有用布隆過(guò)濾器標(biāo)記過(guò)數(shù)據(jù)伤塌,那么,bit 數(shù)組對(duì)應(yīng) bit 位的值仍然為 0轧铁。

當(dāng)需要查詢某個(gè)數(shù)據(jù)時(shí)每聪,我們就執(zhí)行剛剛說(shuō)的計(jì)算過(guò)程,先得到這個(gè)數(shù)據(jù)在 bit 數(shù)組中對(duì)應(yīng)的 N 個(gè)位置。緊接著药薯,我們查看 bit 數(shù)組中這 N 個(gè)位置上的 bit 值绑洛。只要這 N 個(gè) bit 值有一個(gè)不為 1,這就表明布隆過(guò)濾器沒有對(duì)該數(shù)據(jù)做過(guò)標(biāo)記童本,所以真屯,查詢的數(shù)據(jù)一定沒有在數(shù)據(jù)庫(kù)中保存。

布隆過(guò)濾器

圖中布隆過(guò)濾器是一個(gè)包含 10 個(gè) bit 位的數(shù)組穷娱,使用了 3 個(gè)哈希函數(shù)绑蔫,當(dāng)在布隆過(guò)濾器中標(biāo)記數(shù)據(jù) X 時(shí),X 會(huì)被計(jì)算 3 次哈希值泵额,并對(duì) 10 取模配深,取模結(jié)果分別是 1、3嫁盲、7篓叶。所以,bit 數(shù)組的第 1羞秤、3缸托、7 位被設(shè)置為 1。當(dāng)應(yīng)用想要查詢 X 時(shí)瘾蛋,只要查看數(shù)組的第 1俐镐、3、7 位是否為 1瘦黑,只要有一個(gè)為 0京革,那么,X 就肯定不在數(shù)據(jù)庫(kù)中幸斥。

基于布隆過(guò)濾器的快速檢測(cè)特性匹摇,我們可以在把數(shù)據(jù)寫入數(shù)據(jù)庫(kù)時(shí),使用布隆過(guò)濾器做個(gè)標(biāo)記甲葬。當(dāng)緩存缺失后廊勃,應(yīng)用查詢數(shù)據(jù)庫(kù)時(shí),可以通過(guò)查詢布隆過(guò)濾器快速判斷數(shù)據(jù)是否存在经窖。如果不存在坡垫,就不用再去數(shù)據(jù)庫(kù)中查詢了。這樣一來(lái)画侣,即使發(fā)生緩存穿透了冰悠,大量請(qǐng)求只會(huì)查詢 Redis 和布隆過(guò)濾器,而不會(huì)積壓到數(shù)據(jù)庫(kù)配乱,也就不會(huì)影響數(shù)據(jù)庫(kù)的正常運(yùn)行溉卓。布隆過(guò)濾器可以使用 Redis 實(shí)現(xiàn)皮迟,本身就能承擔(dān)較大的并發(fā)訪問壓力。

C桑寨、在請(qǐng)求入口的前端進(jìn)行請(qǐng)求檢測(cè)

緩存穿透的一個(gè)原因是有大量的惡意請(qǐng)求訪問不存在的數(shù)據(jù)伏尼,所以,一個(gè)有效的應(yīng)對(duì)方案是在請(qǐng)求入口前端尉尾,對(duì)業(yè)務(wù)系統(tǒng)接收到的請(qǐng)求進(jìn)行合法性檢測(cè)爆阶,把惡意的請(qǐng)求(例如請(qǐng)求參數(shù)不合理、請(qǐng)求參數(shù)是非法值沙咏、請(qǐng)求字段不存在)直接過(guò)濾掉辨图,不讓它們?cè)L問后端緩存和數(shù)據(jù)庫(kù)。這樣一來(lái)芭碍,也就不會(huì)出現(xiàn)緩存穿透問題了徒役。

4、小結(jié)

緩存雪崩和擊穿主要是因?yàn)閿?shù)據(jù)不在緩存中了窖壕,而緩存穿透則是因?yàn)閿?shù)據(jù)既不在緩存中,也不在數(shù)據(jù)庫(kù)中杉女。

所以瞻讽,緩存雪崩或擊穿時(shí),一旦數(shù)據(jù)庫(kù)中的數(shù)據(jù)被再次寫入到緩存后熏挎,應(yīng)用又可以在緩存中快速訪問數(shù)據(jù)了速勇,數(shù)據(jù)庫(kù)的壓力也會(huì)相應(yīng)地降低下來(lái),而緩存穿透發(fā)生時(shí)坎拐,Redis 緩存和數(shù)據(jù)庫(kù)會(huì)同時(shí)持續(xù)承受請(qǐng)求壓力烦磁。

非常重要的總結(jié)

強(qiáng)調(diào)一下,服務(wù)熔斷哼勇、服務(wù)降級(jí)都伪、請(qǐng)求限流這些方法都是屬于“有損”方案,在保證數(shù)據(jù)庫(kù)和整體系統(tǒng)穩(wěn)定的同時(shí)积担,會(huì)對(duì)業(yè)務(wù)應(yīng)用帶來(lái)負(fù)面影響陨晶。

例如使用服務(wù)降級(jí)時(shí),有部分?jǐn)?shù)據(jù)的請(qǐng)求就只能得到錯(cuò)誤返回信息帝璧,無(wú)法正常處理先誉。

如果使用了服務(wù)熔斷,那么的烁,整個(gè)緩存系統(tǒng)的服務(wù)都被暫停了褐耳,影響的業(yè)務(wù)范圍更大。

而使用了請(qǐng)求限流機(jī)制后渴庆,整個(gè)業(yè)務(wù)系統(tǒng)的吞吐率會(huì)降低铃芦,能并發(fā)處理的用戶請(qǐng)求會(huì)減少买雾,會(huì)影響到用戶體驗(yàn)。

建議是杨帽,盡量使用預(yù)防式方案

針對(duì)緩存雪崩漓穿,合理地設(shè)置數(shù)據(jù)過(guò)期時(shí)間,以及搭建高可靠緩存集群注盈;

針對(duì)緩存擊穿晃危,在緩存訪問非常頻繁的熱點(diǎn)數(shù)據(jù)時(shí),不要設(shè)置過(guò)期時(shí)間老客;

針對(duì)緩存穿透僚饭,提前在入口前端實(shí)現(xiàn)惡意請(qǐng)求檢測(cè),或者規(guī)范數(shù)據(jù)庫(kù)的數(shù)據(jù)刪除操作胧砰,避免誤刪除鳍鸵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市尉间,隨后出現(xiàn)的幾起案子偿乖,更是在濱河造成了極大的恐慌,老刑警劉巖哲嘲,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贪薪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡眠副,警方通過(guò)查閱死者的電腦和手機(jī)画切,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)囱怕,“玉大人霍弹,你說(shuō)我怎么就攤上這事⊥薰” “怎么了典格?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)忘闻。 經(jīng)常有香客問我钝计,道長(zhǎng),這世上最難降的妖魔是什么齐佳? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任私恬,我火速辦了婚禮,結(jié)果婚禮上炼吴,老公的妹妹穿的比我還像新娘本鸣。我一直安慰自己,他們只是感情好硅蹦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布荣德。 她就那樣靜靜地躺著闷煤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涮瞻。 梳的紋絲不亂的頭發(fā)上鲤拿,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音署咽,去河邊找鬼近顷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宁否,可吹牛的內(nèi)容都是我干的窒升。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼慕匠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼饱须!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起台谊,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蓉媳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后青伤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體督怜,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年狠角,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚪腋。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丰歌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屉凯,到底是詐尸還是另有隱情立帖,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布悠砚,位于F島的核電站晓勇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏灌旧。R本人自食惡果不足惜绑咱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枢泰。 院中可真熱鬧描融,春花似錦、人聲如沸衡蚂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至年叮,卻和暖如春具被,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背只损。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工一姿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人改执。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓啸蜜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親辈挂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子衬横,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 作者:GarbageCollection 鏈接:https://www.nowcoder.com/discuss/...
    Sonyhandsome閱讀 139評(píng)論 0 0
  • ORA-00001: 違反唯一約束條件 (.) ORA-00017: 請(qǐng)求會(huì)話以設(shè)置跟蹤事件 ORA-00018:...
    小白白程序猿閱讀 1,711評(píng)論 0 0
  • 概述 什么是Redis Redis(Remote Dictionary Server) 是一個(gè)使用 C 語(yǔ)言編寫的...
    老pao說(shuō)Java閱讀 1,093評(píng)論 0 1
  • Redis 總體概述 “兩大維度”就是指系統(tǒng)維度和應(yīng)用維度,“三大主線”也就是指高性能终蒂、高可靠和高可擴(kuò)展(可以簡(jiǎn)稱...
    穿囚服的兔子閱讀 160評(píng)論 0 0
  • xxl-job如何保證定時(shí)任務(wù)只執(zhí)行一次 1蜂林、業(yè)務(wù)邏輯代碼和定時(shí)任務(wù)邏輯完全分開部署2、調(diào)度框架集群(rehash...
    小丑的果實(shí)閱讀 1,006評(píng)論 0 0