Redis緩存穿透、擊穿、雪崩等場(chǎng)景解決方案
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
一、緩存穿透定義:查詢一個(gè)不存在的數(shù)據(jù),Mysql查詢不到數(shù)據(jù)也不會(huì)直接寫入緩存,導(dǎo)致每次請(qǐng)求都要查數(shù)據(jù)庫(kù) 兩個(gè)解決方案:
舉例說(shuō)明:根據(jù)文章id查詢文章,請(qǐng)求路徑如下: 正常緩存流程:根據(jù)id到redis中爬取數(shù)據(jù),若找到數(shù)據(jù)則返回結(jié)果;若redis中未找到,再到數(shù)據(jù)庫(kù)中查找,將結(jié)果返回,返回前需將數(shù)據(jù)庫(kù)中查到的數(shù)據(jù)存儲(chǔ)于redis中 緩存穿透是查詢一個(gè)不存在的數(shù)據(jù),Mysql查詢不到數(shù)據(jù)也不會(huì)直接寫入緩存,導(dǎo)致每次請(qǐng)求都要查數(shù)據(jù)庫(kù)。導(dǎo)致這種情況一般是由于系統(tǒng)被惡意攻擊,請(qǐng)求路徑被獲取后制造假id(0、復(fù)數(shù)、很大的值),瘋狂沖擊數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)并發(fā)并不高,請(qǐng)求達(dá)到一定量就會(huì)造成宕機(jī) 關(guān)于布隆過濾器 二、緩存擊穿定義:給某個(gè)key設(shè)置過期時(shí)間,當(dāng)key過期時(shí),剛好這個(gè)時(shí)間點(diǎn)key有大量的并發(fā)請(qǐng)求,這些并發(fā)請(qǐng)求可能瞬間把DB壓垮。 雖然我們?cè)俨樵儠r(shí)把數(shù)據(jù)同步到redis,但可能在緩存重建時(shí),存入的是多個(gè)表匯總的結(jié)果,可能需要分組統(tǒng)計(jì)花費(fèi)較長(zhǎng)的時(shí)間,比如花費(fèi)了50毫秒,這時(shí)若有大量請(qǐng)求數(shù)據(jù)庫(kù)是承受不住的。 兩個(gè)解決方案:
互斥鎖:強(qiáng)一致性、性能差 邏輯過期:高可用、性能優(yōu) 三、緩存雪崩定義:指同一時(shí)段大量緩存key同時(shí)失效或Redis服務(wù)宕機(jī),導(dǎo)致大量請(qǐng)求達(dá)到數(shù)據(jù)庫(kù)造成巨大壓力。 解決方案
降級(jí)可作為系統(tǒng)的保底策略,適用于穿透、擊穿、雪崩 四、雙寫一致性定義:當(dāng)修改了數(shù)據(jù)庫(kù)數(shù)據(jù)也要更新緩存的數(shù)據(jù),保持緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)一致
先刪除緩存,還是先修改數(shù)據(jù)庫(kù)? 先刪除緩存,再修改數(shù)據(jù)庫(kù)
修改數(shù)據(jù)庫(kù)數(shù)據(jù)前被其他線程寫入緩存,導(dǎo)致緩存與數(shù)據(jù)庫(kù)數(shù)據(jù)不一致 先修改操作數(shù)據(jù)庫(kù),再刪除緩存
線程1得到的返回的結(jié)果寫入緩存,與線程2更新的數(shù)據(jù)庫(kù)數(shù)據(jù)對(duì)不上 所以不管先刪除緩存,還是先修改數(shù)據(jù)庫(kù)都會(huì)出現(xiàn)臟數(shù)據(jù),應(yīng)該采取延遲雙刪的方法,即刪除兩次緩存,可以降低臟數(shù)據(jù)的出現(xiàn)。延遲刪除是因?yàn)閿?shù)據(jù)庫(kù)是主存模式,延遲刪除讓主節(jié)點(diǎn)把數(shù)據(jù)同步到從節(jié)點(diǎn),但延遲刪除也只是控制了一部分臟數(shù)據(jù)的風(fēng)險(xiǎn),由于延遲時(shí)間不好確認(rèn),也有臟數(shù)據(jù)的風(fēng)險(xiǎn),做不到絕對(duì)的強(qiáng)一至。 如何保持強(qiáng)一致性?
強(qiáng)一致,性能低 一般存入緩存的數(shù)據(jù)都是讀多寫少,用讀寫鎖來(lái)進(jìn)行控制
具體代碼操作:
利用異步通知解決數(shù)據(jù)同步問題
它是基于mysql的主從同步實(shí)現(xiàn) 五、持久化兩種方式:RDB、AOF
將內(nèi)存中的數(shù)據(jù)存到磁盤中,當(dāng)redis實(shí)例故障重啟后,從磁盤讀取快照文件,恢復(fù)數(shù)據(jù) 人工主動(dòng)備份: redis內(nèi)部有觸發(fā)RBG的機(jī)制,可以在redis.conf文件中找到
六、數(shù)據(jù)過期策略Redis過期刪除策略:惰性刪除 + 定期刪除兩種策略配合使用
定義:訪問key時(shí)再判斷是否過期,過期則刪除,反之返回key ? ?優(yōu)點(diǎn):對(duì)CPU友好
定義:每隔一段時(shí)間,會(huì)從一定數(shù)量的數(shù)據(jù)庫(kù)中取出一定數(shù)量的隨機(jī)key進(jìn)行檢查,并刪除其中的過期key(隨之時(shí)間推一會(huì)遍歷所有key,把所有過期key刪除)
優(yōu)點(diǎn):可通過限制刪除操作執(zhí)行時(shí)長(zhǎng)和頻率減少刪除操作對(duì)CPU的影響,另外定期刪除能有效釋放過期鍵占用的內(nèi)存 七、數(shù)據(jù)淘汰策略定義:當(dāng)redis內(nèi)存不足想添加新key,會(huì)按照某種規(guī)則將內(nèi)存數(shù)據(jù)刪除,這種數(shù)據(jù)刪除規(guī)則被成為內(nèi)存的淘汰策略
使用建議 轉(zhuǎn)自https://www.cnblogs.com/PandaVerse/p/18399430 該文章在 2025/5/15 9:52:50 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |