緩存穿透是指未在緩存中存儲(chǔ)的數(shù)據(jù)直接訪問(wèn)數(shù)據(jù)庫(kù),可通過(guò)布隆過(guò)濾器、空值緩存、熔斷機(jī)制解決。
什么是 Redis 緩存穿透?
Redis 緩存穿透是指當(dāng)客戶端向緩存請(qǐng)求一個(gè)未在緩存中存儲(chǔ)的數(shù)據(jù)時(shí),緩存服務(wù)器直接放行該請(qǐng)求,導(dǎo)致請(qǐng)求直接訪問(wèn)數(shù)據(jù)庫(kù)。
如何理解緩存穿透?
緩存的作用是暫時(shí)存儲(chǔ)熱門(mén)數(shù)據(jù),以避免數(shù)據(jù)庫(kù)頻繁查詢,提高性能。然而,當(dāng)查詢一個(gè)不存在于緩存中的冷門(mén)數(shù)據(jù)時(shí),緩存直接放行該請(qǐng)求,查詢穿透到了數(shù)據(jù)庫(kù)。
導(dǎo)致緩存穿透的原因:
惡意攻擊:攻擊者故意查詢不存在的數(shù)據(jù),導(dǎo)致大量無(wú)效查詢穿透到數(shù)據(jù)庫(kù),造成性能瓶頸。
業(yè)務(wù)場(chǎng)景復(fù)雜:業(yè)務(wù)邏輯復(fù)雜,存在很多罕見(jiàn)場(chǎng)景或邊緣情況,導(dǎo)致大量冷門(mén)數(shù)據(jù)查詢。
緩存配置不當(dāng):緩存容量過(guò)小或過(guò)期策略不合理,導(dǎo)致熱門(mén)數(shù)據(jù)頻繁失效。
解決緩存穿透的方法:
布隆過(guò)濾器:使用布隆過(guò)濾器預(yù)先判斷數(shù)據(jù)是否存在于緩存,如果有,則直接返回;如果沒(méi)有,則放行請(qǐng)求。
空值緩存:當(dāng)緩存中沒(méi)有找到數(shù)據(jù)時(shí),緩存一個(gè)空值,并將空值返回給客戶端。這可以有效防止后續(xù)對(duì)相同數(shù)據(jù)的無(wú)效查詢。
熔斷機(jī)制:當(dāng)緩存穿透達(dá)到一定閾值時(shí),啟動(dòng)熔斷機(jī)制,將所有請(qǐng)求直接放行到數(shù)據(jù)庫(kù),避免對(duì)數(shù)據(jù)庫(kù)造成進(jìn)一步的性能影響。