Redis 緩存問(wèn)題及解決
一,緩存穿透(key在數(shù)據(jù)庫(kù)不存在)
當(dāng)數(shù)據(jù)既不在緩存中,也不在數(shù)據(jù)庫(kù)中,導(dǎo)致請(qǐng)求訪問(wèn)緩存沒(méi)數(shù)據(jù),訪問(wèn)數(shù)據(jù)庫(kù)也沒(méi)數(shù)據(jù),即 每次都一穿到底。
當(dāng)有大量這樣的請(qǐng)求到來(lái)時(shí),數(shù)據(jù)庫(kù)的壓力驟增。
解決:
對(duì)請(qǐng)求過(guò)濾:參數(shù)檢查、黑名單、白名單等,直接拒絕。
緩存空值:對(duì)查詢不存在的數(shù)據(jù)也緩存下來(lái)(值為null),并設(shè)置較短過(guò)期時(shí)間。
使用布隆過(guò)濾器快速判斷數(shù)據(jù)是否存在,避免通過(guò)查詢數(shù)據(jù)庫(kù)來(lái)判斷(使用bitmaps實(shí)現(xiàn)):在寫入數(shù)據(jù)庫(kù)數(shù)據(jù)時(shí),使用布隆過(guò)濾器做個(gè)標(biāo)記,然后在用戶請(qǐng)求發(fā)現(xiàn)緩存沒(méi)有值時(shí),查詢布隆過(guò)濾器快速判斷數(shù)據(jù)是否存在。
二,緩存擊穿(熱點(diǎn)key過(guò)期)
對(duì)于熱點(diǎn)數(shù)據(jù),當(dāng)緩存失效的一瞬間,所有的請(qǐng)求都被下放到數(shù)據(jù)庫(kù)去請(qǐng)求更新緩存,數(shù)據(jù)庫(kù)被壓垮。
解決:
訪問(wèn)數(shù)據(jù)庫(kù)加分布式鎖:獲得鎖的那個(gè)線程才能去訪問(wèn)數(shù)據(jù)庫(kù),并寫回緩存,其他線程等待。
熱點(diǎn)數(shù)據(jù)不過(guò)期:由后臺(tái)異步更新緩存,或者在熱點(diǎn)數(shù)據(jù)即將過(guò)期前,提前通知后臺(tái)線程更新緩存以及重新設(shè)置過(guò)期時(shí)間。
三,緩存雪崩(大量key同時(shí)過(guò)期)
當(dāng)大量緩存在同一時(shí)間過(guò)期,如果此時(shí)有大量的用戶請(qǐng)求,瞬間所有的請(qǐng)求都被下放到數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)就崩掉了。
解決:
將緩存失效時(shí)間隨機(jī)打散 : 在原有的失效時(shí)間基礎(chǔ)上增加一個(gè)隨機(jī)值(比如1到10分鐘)這樣每個(gè)緩存的過(guò)期時(shí)間都不重復(fù)了,也就降低了緩存集體失效的概率。
緩存設(shè)置為不過(guò)期 : 通過(guò)后臺(tái)服務(wù)來(lái)更新緩存數(shù)據(jù)。
相關(guān)文章
Redis 哨兵機(jī)制及配置實(shí)現(xiàn)
本文主要介紹了Redis 哨兵機(jī)制及配置實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
redis-cli創(chuàng)建redis集群的實(shí)現(xiàn)
本文主要介紹了redis-cli創(chuàng)建redis集群的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06
Redis總結(jié)筆記(二):C#連接Redis簡(jiǎn)單例子
這篇文章主要介紹了Redis總結(jié)筆記(二):C#連接Redis簡(jiǎn)單例子,需要的朋友可以參考下2015-01-01
使用 Redis 流實(shí)現(xiàn)消息隊(duì)列的代碼
這篇文章主要介紹了使用 Redis 流實(shí)現(xiàn)消息隊(duì)列,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11

