緩存穿透
描述:客戶端請(qǐng)求數(shù)據(jù)庫(kù)/緩存中都不存在的數(shù)據(jù),導(dǎo)致每一次請(qǐng)求都要查詢數(shù)據(jù)庫(kù),增加數(shù)據(jù)庫(kù)壓力。
解決: 熱點(diǎn)數(shù)據(jù)預(yù)加載并使用布隆過(guò)濾器、緩存空對(duì)象
緩存擊穿
描述: 緩存數(shù)據(jù)過(guò)期的時(shí)候,突然產(chǎn)生大量查詢請(qǐng)求,導(dǎo)致多次重復(fù)查詢數(shù)據(jù)庫(kù),增大訪問(wèn)壓力
解決: 使用鎖來(lái)限制請(qǐng)求次數(shù)
緩存雪崩
描述:由于宕機(jī)或過(guò)期導(dǎo)致大量緩存集體失效,導(dǎo)致出現(xiàn)大量的查詢數(shù)據(jù)庫(kù)請(qǐng)求,可能造成數(shù)據(jù)庫(kù)崩潰
解決:
1.熱點(diǎn)數(shù)據(jù)過(guò)期時(shí)間不要統(tǒng)一,均勻分布
2.做二級(jí)緩存,A1、A2,A1過(guò)期時(shí)間短,A2過(guò)期時(shí)間長(zhǎng),A1失效查A2
3.使用鎖來(lái)限制請(qǐng)求次數(shù)
4.分布式情況下、均勻分布熱點(diǎn)數(shù)據(jù)
單機(jī)鎖
setnx、setex
使用jvm提供的Lock
設(shè)置過(guò)期時(shí)間
每個(gè)任務(wù)開(kāi)一個(gè)守護(hù)線程續(xù)期/創(chuàng)建UUID存放在ThreadLocal,通過(guò)UUID來(lái)判斷用lua解鎖
分布式鎖
redisson
存在的問(wèn)題:如果master加了鎖,這時(shí)候沒(méi)來(lái)得及同步給slave,master宕機(jī)了,就會(huì)導(dǎo)致有兩個(gè)客戶端獲取鎖,可以嘗試使用多把鎖,有多少個(gè)master就申請(qǐng)多少把鎖,這些所應(yīng)該均勻分布到master
Lua解鎖模板
if redis.call("get",KEYS[1])==ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end