公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

Redis緩存穿透、擊穿、雪崩等場景解決方案

freeflydom
2025年5月15日 9:49 本文熱度 47

一、緩存穿透

定義:查詢一個不存在的數據,Mysql查詢不到數據也不會直接寫入緩存,導致每次請求都要查數據庫

兩個解決方案:

  1. 緩存空數據
    優點:簡單
    缺點:消耗內存,可能發生不一致問題

  2. 使用布隆過濾器(作用:攔截不存在的數據)
    優點:內存占用較少
    缺點:實現復雜,存在誤判

舉例說明:根據文章id查詢文章,請求路徑如下:
一個get請求: api/enws/getById/1

正常緩存流程:根據id到redis中爬取數據,若找到數據則返回結果;若redis中未找到,再到數據庫中查找,將結果返回,返回前需將數據庫中查到的數據存儲于redis中

緩存穿透是查詢一個不存在的數據,Mysql查詢不到數據也不會直接寫入緩存,導致每次請求都要查數據庫。導致這種情況一般是由于系統被惡意攻擊,請求路徑被獲取后制造假id(0、復數、很大的值),瘋狂沖擊數據庫,數據庫并發并不高,請求達到一定量就會造成宕機

關于布隆過濾器

二、緩存擊穿

定義:給某個key設置過期時間,當key過期時,剛好這個時間點key有大量的并發請求,這些并發請求可能瞬間把DB壓垮。

雖然我們再查詢時把數據同步到redis,但可能在緩存重建時,存入的是多個表匯總的結果,可能需要分組統計花費較長的時間,比如花費了50毫秒,這時若有大量請求數據庫是承受不住的。

兩個解決方案:

  1. 互斥鎖

  2. 邏輯過期

互斥鎖:強一致性、性能差
比如:跟錢相關的業務需要保證強一致性
互斥鎖文字描述:線程1請求查詢,在redis中未查詢到緩存數據,于是獲取互斥鎖,查詢數據庫重建緩存數據,寫入緩存,釋放鎖;線程1進行的同時線程2也請求查詢未命中,于是獲取互斥鎖但失敗了,只能休眠會再一直重試到緩存命中。
互斥鎖的作用:確保任意時刻只有一個線程可以訪問共享資源,從而避免數據競爭和不一致問題。

邏輯過期:高可用、性能優
比如:互聯網行業,更加注重用戶體驗
邏輯過期文字描述:線程1查詢緩存,發現邏輯時間已過期,獲取互斥鎖后,開啟新線程2查詢數據庫重建緩存數據、寫入緩存并重置邏輯過期時間、釋放鎖,同時線程1中繼續并返回過期數據。線程1進行的同時線程3也查詢發現邏輯時間過期,獲取互斥鎖失敗后返回過期數據。當線程4命中緩存并沒有過期,就可以獲得最新查詢數據了。

三、緩存雪崩

定義:指同一時段大量緩存key同時失效或Redis服務宕機,導致大量請求達到數據庫造成巨大壓力。

解決方案

  1. 給不同key的TTL添加隨機值(給不同key設置不同的過期時間)

  2. 利用redis集群服務的可用性,比如哨兵模式、集群模式(解決redis宕機問題)

  3. 給緩存業務添加降級限流策略,例如ngxin、spring cloud gateway

  4. 給業務添加多級緩存,例如Guava、Caffeine

降級可作為系統的保底策略,適用于穿透、擊穿、雪崩

四、雙寫一致性

定義:當修改了數據庫數據也要更新緩存的數據,保持緩存和數據庫的數據一致

  • 讀操作:緩存命中,直接返回;緩存未命中查詢數據庫,寫入緩存,設定超時時間

  • 寫操作:延遲雙刪

先刪除緩存,還是先修改數據庫?

先刪除緩存,再修改數據庫

  • 正常情況:

  • 出現臟數據情況:

修改數據庫數據前被其他線程寫入緩存,導致緩存與數據庫數據不一致

先修改操作數據庫,再刪除緩存

  • 正常情況:

  • 出現臟數據情況:

線程1得到的返回的結果寫入緩存,與線程2更新的數據庫數據對不上

所以不管先刪除緩存,還是先修改數據庫都會出現臟數據,應該采取延遲雙刪的方法,即刪除兩次緩存,可以降低臟數據的出現。延遲刪除是因為數據庫是主存模式,延遲刪除讓主節點把數據同步到從節點,但延遲刪除也只是控制了一部分臟數據的風險,由于延遲時間不好確認,也有臟數據的風險,做不到絕對的強一至。

如何保持強一致性?

  1. 可以采用分布式鎖(互斥鎖)

強一致,性能低

一般存入緩存的數據都是讀多寫少,用讀寫鎖來進行控制

  • 共享鎖:加鎖后其他線程可以共享讀操作

  • 排他鎖:加鎖后阻塞其他線程讀寫操作

具體代碼操作:

  • 讀操作

  • 寫操作

  1. 異步通知保證數據的最終一致性

利用異步通知解決數據同步問題

  • MQ

  • canal

它是基于mysql的主從同步實現
當有數據修改寫入數據庫后,數據庫一旦變化就會記錄到BINLOG日志文件中,cannal通過binlog數據文件獲取變化,我們就可以在緩存服務獲取變化的數據,然后更新到緩存

五、持久化

兩種方式:RDB、AOF

  1. RDB(redis數據備份文件,也叫數據快照)

將內存中的數據存到磁盤中,當redis實例故障重啟后,從磁盤讀取快照文件,恢復數據

人工主動備份:

redis內部有觸發RBG的機制,可以在redis.conf文件中找到

  1. AOF(追加文件,redis處理的每一個命令都記錄在AOF文件,可看作是命令日志文件)

六、數據過期策略

Redis過期刪除策略:惰性刪除 + 定期刪除兩種策略配合使用

  1. 惰性刪除

定義:訪問key時再判斷是否過期,過期則刪除,反之返回key

    ?    ?優點:對CPU友好
    ?    ?缺點:對內存不友好

  1. 定期刪除

定義:每隔一段時間,會從一定數量的數據庫中取出一定數量的隨機key進行檢查,并刪除其中的過期key(隨之時間推一會遍歷所有key,把所有過期key刪除)

  • 定期刪除分兩種模式:SLOW、FAST

  • ?SLOW模式是定時任務,執行頻率默認為10hz,每次不超過25ms,以通過修改配置文件redis.conf的hz選項來調整次數

  • FAST模式執行頻率不固定,但兩次間隔不低于2ms,每次耗時不好過1ms

優點:可通過限制刪除操作執行時長和頻率減少刪除操作對CPU的影響,另外定期刪除能有效釋放過期鍵占用的內存
缺點:難以確定刪除操作執行的時長和頻率

七、數據淘汰策略

定義:當redis內存不足想添加新key,會按照某種規則將內存數據刪除,這種數據刪除規則被成為內存的淘汰策略

  • redis支持8中不同策略來選擇刪除key

  1. noeviction:不淘汰任何key,但內存滿不語序寫入新數據,默認策略

使用建議

轉自https://www.cnblogs.com/PandaVerse/p/18399430


該文章在 2025/5/15 9:52:50 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产高清午夜成人在线观看 | 国产美女视频免费观看的网站 | 成在人线v无码免费高潮喷水 | 国产精品成人无码久久久久久 | 国产gv顾泽宇视 | 91精品国产一区自在线拍 | 国产三级av电影在线观看 | 国产极品嫩模 | 国产熟女一区二区五月婷 | 国产成人综合久久免费导航 | 精品毛片久久久久久一 | 2025国产精品极品色在线 | 国产欧美日韩综合 | 国产91尤物中文在线 | 高清无码在国产极 | 国产精品无码aⅴ精品影院 国产精品无码aⅴ一区二区三区 | 99久久精品无码免费视频播放 | 国产福利91精品一区二区三 | 国产大片免费观看中文字幕 | 国产丝袜视频在 | 国产午夜无码精品免费看粉 | 国产爆乳美女呻吟娇喘在线播放 | 18禁成人黄网站免费视频 | 国产精品大片在线看 | 99久久综合精品免费 | 国产成人影院一区二区三区 | 国内外一级毛片 | 911久久香蕉国产线看观看 | 成人亚洲欧美成αⅴ人在线观看 | 国产综合成人色产 | 国产高潮成人免费视频在线观看 | 国产三级片久久久久久水户 | 高清无码v视频日本www | 97人妻起碰免费公开视频不卡 | a级毛片免费看久久久 | 国产一区二区三区精品欧 | 精品国产一区二区三区四区特色 | 国产精品无码久久久最线观看 | 国产三级国产av | 国产亚洲日韩欧美自拍另类 | 国产麻豆精品一区二区三区v视 |