簡要說下緩存穿透,緩存擊穿,緩存雪崩的出現(xiàn)情景和解決方案!

出現(xiàn)上述問題的前提:因?yàn)閿?shù)據(jù)庫使用磁盤存取數(shù)據(jù),往往比較慢,而緩存使用內(nèi)存(而且通常是key-value型),存取較快!

這樣先使用內(nèi)存緩存來緩存數(shù)據(jù)庫數(shù)據(jù),讀取數(shù)據(jù)的時(shí)候先從緩存讀取,只有獲取不到的時(shí)候才從數(shù)據(jù)庫獲?。?/p>

java如何解決內(nèi)存緩存擊穿問題?

下面分別從概念,出現(xiàn)場景,解決方案來說:

①,緩存穿透

概念:訪問一個(gè)不存在的key,所有的讀取都會(huì)訪問數(shù)據(jù)庫,通常數(shù)據(jù)庫中也沒有這樣的數(shù)據(jù),造成穿透,數(shù)據(jù)量大時(shí),導(dǎo)致數(shù)據(jù)庫卡死!

出現(xiàn)情景:一般數(shù)據(jù)庫都是使用正整數(shù)來做id,然后使用id作為key緩存,如果有人惡意攻擊,傳一個(gè)負(fù)數(shù)(-100)做大量查詢,那么數(shù)據(jù)庫崩潰!

解決辦法:

1,設(shè)置攔截,對(duì)不符合要求的id直接攔截!

2,緩存不存在,數(shù)據(jù)庫也不存在也進(jìn)行數(shù)據(jù)保存,key-null,并設(shè)置過期時(shí)間(短點(diǎn)好,1min),這樣能攔截短時(shí)間內(nèi)大量的同一個(gè)key的穿透!

java如何解決內(nèi)存緩存擊穿問題?

②,緩存擊穿

概念:緩存擊穿通常發(fā)生在超高并發(fā)的時(shí)候,緩存中的key超時(shí)過期,這時(shí)候大量的請求同一時(shí)間落到數(shù)據(jù)庫,造成數(shù)據(jù)庫卡死!

出現(xiàn)場景:秒殺活動(dòng)通常會(huì)把商品id等提前進(jìn)行緩存,如果某個(gè)正想辭職的程序員在設(shè)置過期時(shí)間的時(shí)候,把過期時(shí)間設(shè)在了秒殺前一刻,那秒殺開始的時(shí)候,大量的請求將直接訪問數(shù)據(jù)庫!

解決辦法:

1,熱點(diǎn)數(shù)據(jù)設(shè)置超長的過期時(shí)間(甚至forever)

2,人為干預(yù):在活動(dòng)開始前先對(duì)所有熱點(diǎn)數(shù)據(jù)進(jìn)行設(shè)置!

③,緩存雪崩

概念:大批量的key過期,導(dǎo)致大量的查詢到了持久層,引起卡死!主要是大量的key,而緩存擊穿通常是一個(gè)或者少量key!

出現(xiàn)場景:緩存服務(wù)器宕機(jī),代碼錯(cuò)誤等導(dǎo)致key大量過期等原因!

解決方法:

1,高可用緩存集群,保證緩存不掛!

2,過期時(shí)間使用隨機(jī)算法,防止同一時(shí)間過期!