Redis 緩存穿透、擊穿、雪崩是一些常見的緩存問題,下面簡要介紹一下:
1. 緩存穿透
緩存穿透是指無論是新數(shù)據(jù)還是舊數(shù)據(jù),都無法在緩存中找到對應(yīng)的值,從而導(dǎo)致請求一直訪問后端數(shù)據(jù)庫。造成緩存穿透的原因通常是惡意攻擊或者緩存中沒有需要的值。
解決方案:
- 緩存空值,即使請求一個不存在的鍵也將空值存儲在緩存中,以后的請求就可以直接從緩存中獲取空值,降低對后端數(shù)據(jù)庫的壓力。
- 布隆過濾器,先判斷請求的鍵是否存在于緩存中,不存在就直接返回空值。
2. 緩存擊穿
緩存擊穿是指緩存中沒有但數(shù)據(jù)庫中存在的數(shù)據(jù),在高并發(fā)情況下,突然有大量的請求訪問這些不存在的數(shù)據(jù),導(dǎo)致數(shù)據(jù)庫壓力過大。
解決方案:
- 加鎖,對緩存空失效的情況進行加鎖,只有一次性地從數(shù)據(jù)庫加載數(shù)據(jù)并更新緩存中的鍵才能夠解鎖。
- 提前預(yù)加載,提前在緩存中加載一些熱門的數(shù)據(jù),避免突然緩存穿透導(dǎo)致大量請求同時訪問數(shù)據(jù)庫。
3. 緩存雪崩
緩存雪崩是指大量的緩存數(shù)據(jù)在同一時間失效,導(dǎo)致大量的請求直接打到數(shù)據(jù)庫上,導(dǎo)致數(shù)據(jù)庫崩潰。
解決方案:
- 緩存失效時間分散,通過在緩存中設(shè)置過期時間的隨機性來分散緩存的失效時間,避免大量緩存同時失效。
- 限流降級,設(shè)置系統(tǒng)限流,對請求進行限制,減小緩存雪崩的概率。
- 雙緩存策略,使用兩級緩存結(jié)構(gòu),將請求分配到兩個不同的緩存中,當一個緩存失效時,另一個緩存可以繼續(xù)提供服務(wù)。