redis緩存問(wèn)題以及鎖

緩存穿透

描述:客戶端請(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容