Redis擊穿、穿透、雪崩產(chǎn)生原因以及解決思路
時間:2021-11-03 14:19:37
手機(jī)看文章
掃描二維碼
隨時隨地手機(jī)看文章
[導(dǎo)讀]作者:等不到的口琴來源:www.cnblogs.com/Courage129/p/14348720.html擊穿大家都知道,計(jì)算機(jī)的瓶頸之一就是IO,為了解決內(nèi)存與磁盤速度不匹配的問題,產(chǎn)生了緩存,將一些熱點(diǎn)數(shù)據(jù)放在內(nèi)存中,隨用隨取,降低連接到數(shù)據(jù)庫的請求鏈接,避免數(shù)據(jù)庫掛掉。需...
為什么會有擊穿發(fā)生呢?
有兩個主要原因:
Key被頁面置換淘汰
應(yīng)對擊穿的處理思路
正常的處理請求如圖:
-
請求到達(dá)Redis,發(fā)現(xiàn)Redis Key過期,查看有沒有鎖,沒有鎖的話回到隊(duì)列后面排隊(duì)
-
設(shè)置鎖,注意,這兒應(yīng)該是setnx(),而不是set(),因?yàn)榭赡苡衅渌€程已經(jīng)設(shè)置鎖了
-
獲取鎖,拿到鎖了就去數(shù)據(jù)庫取數(shù)據(jù),請求返回后釋放鎖。
穿透
穿透主要原因是很多請求都在訪問數(shù)據(jù)庫不存在的數(shù)據(jù),例如一個賣書的商城一直被請求查詢茶葉產(chǎn)品,由于Redis緩存主要是用來緩存熱點(diǎn)數(shù)據(jù),對于數(shù)據(jù)庫都不存在的數(shù)據(jù),是沒法緩存的,這種異常流量就會直接到達(dá)數(shù)據(jù)庫并且返回"沒有"的查詢結(jié)果。
雪崩
雪崩,和擊穿類似,不同的是擊穿是一個熱點(diǎn)Key某時刻失效,而雪崩是大量的熱點(diǎn)Key在一瞬間失效,網(wǎng)絡(luò)上很多博客都在強(qiáng)調(diào)解決雪崩的策略是隨機(jī)過期時間,這個非常不準(zhǔn)確,舉個例子,銀行做活動,之前這個利息系數(shù)為2%,過了零點(diǎn)系數(shù)改為3%,這種情況能將用戶的對應(yīng)的key改為隨機(jī)過期嗎?如果用的過去的數(shù)據(jù)叫臟數(shù)據(jù)。