Redis_緩存3_緩存異常(數據不一致、雪崩、擊穿、穿透)

14.6緩存異常

四個方面

  • 緩存中數據和數據庫不一致
  • 緩存雪崩
  • 緩存擊穿
  • 緩存穿透

14.6.1數據不一致:

一致性包括兩種情況

  • 緩存中有數據,需要和數據庫值相同
  • 緩存中沒有數據,數據庫中的數據是最新值

如果不符合以上兩種情況,則出現數據不一致的問題。

讀寫緩存

  • 同步直寫
  • 異步寫回

只讀緩存

  1. 新增數據
    • 數據直接寫到數據庫中,緩存不做操作。滿足一致性兩種情況的第2種。
  2. 刪改數據
    • 先刪除緩存,后更新數據庫。可能會導致,緩存刪除成功,數據庫更新失敗。業務邏輯去訪問數據時,緩存中查不到數據,緩存缺失,到數據庫中查詢,所以只拿到舊的數據。
    • 如果新更新數據庫,再刪除緩存。可能會導致,數據庫更新成功,緩存刪除失敗。數據庫中的數據是新的值,緩存中存儲的是舊值。再讀取時,先從緩存中讀取,讀取到了舊值。

解決數據不一致的方案

  • 重試機制:把刪除的緩存值或要更新數據庫值先存儲到消息隊列中(kafka消息隊列)。
  • 如果發現試了10次還不成功就會向服務器端報錯

多線程訪問的情況

  1. 先刪除緩存,再更新數據庫。
    • 假設T1線程先刪除緩存,再執行更新數據庫。還未更新成功時,T2線程進行讀取,發現緩存中沒有數據,到數據庫中讀取,會讀取到舊的數據。如果T2還將舊數據更新到緩存中,那T1線程再進行讀取,也讀到的舊值。
    • 讓T1線程先執行休眠一段時間。T1線程在休眠時間,讓T2線程執行結束,會將數據重新寫入緩存。T1線程再做一次緩存刪除操作。“延遲雙刪”。
      redis.delCache()
      db.update()
      Thread.sleep(2000)
      redis.delCache()
      
  2. 先更新數據庫值,再去刪除緩存
    • 假設T1線程先刪除或更新數據庫中的值,還沒來得及刪除緩存時,T2線程就開始讀取數據。T2會先從緩存中讀取,緩存命中,T2拿到的就是舊的數據。直到T1將緩存中數據刪除,其他線程再次讀取,可以拿到新值.
并發操作執行順序可能出現問題問題描述解決方案
沒有先刪除緩存,后更新數據庫緩存刪除成功,數據庫更新失敗從數據庫讀到舊數據重試(通過消息隊列)
先刪除緩存,后更新數據庫緩存刪除,未更新數據庫,其他線程并發訪問并發線程從數據庫讀到舊值,并更新了緩存,其他線程都從緩存中讀到舊值延遲雙刪
沒有先更新數據庫,后刪除緩存數據庫更新成功,緩存刪除失敗從緩存中讀到舊值重試(通過消息隊列)
先更新數據庫,后刪除緩存數據庫更新成功,未刪除緩存,其他同線程并發訪問并發線程從緩存讀到舊值會有數據不一致情況短暫存在

14.6.2 緩存雪崩

大量的應用請求無法在redis中完成處理。緩存中讀取不到數據,直接進入到數據庫服務器。數據庫壓力激增,數據庫崩潰,請求堆積在redis,導致redis服務器崩潰,導致redis集群崩潰,應用服務器崩潰,稱為雪崩

原因1:緩存中有大量數據同時過期

解決方案:

  1. 頁面靜態化處理數據:對于不經常更換的數據,生成靜態頁
  2. 避免大量數據同時過期:為商品過期時間追加一個隨機數,在一個較小的范圍內(1~3分鐘)。
  3. 構建多級緩存架構:redis緩存+nginx緩存+ehcache緩存
  4. 延長或取消熱度超高的數據過期時間
  5. 服務降級

不同的數據采取不同的處理方式。

原因2:redis實例故障

解決方案:

  1. 服務熔斷或限流處理

提前預防:

  • 災難預警:監控redis服務器性能指標,包括數據庫服務器性能指標,CPU、內存、平均響應時間、線程數等
  • 集群:有節點出一故障,主從切換。

14.6.2 緩存擊穿

對某個訪問頻繁熱點數據的請求。主要發生在熱點數據失效
解決方案:

  • 預先設定:電商雙11,商鋪設定幾款是主打商品,延長過期時間
  • 實時監控:監控訪問量,避免訪問量激增
  • 定時任務:啟動任務調度器,后臺刷新數據有效期
  • 分布式鎖:可防止緩存擊穿,但會有性能問題 (不推薦)

14.6.3 緩存穿透

要訪問的數據在redis中不存在,在數據庫中也不存在。
原因:

  1. 業務層誤操作
  2. 惡意攻擊

解決方案:

  1. 緩存空值或缺省值
  2. 使用布隆過濾器,快速判斷數據是否存在
  3. 在請求入口前端進行請求檢測
  4. 實時監控
  5. key加密

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35850.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35850.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35850.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux tee

tee 是一個命令行工具,它可以從標準輸入讀取數據,并將其同時輸出到標準輸出和指定的文件中。tee 命令非常實用,特別是在需要同時查看輸出內容和將其保存到文件中的情況下。 tee 命令的基本語法如下: command | tee [options] [f…

Mysql 搭建MHA高可用架構,實現自動failover,完成主從切換

目錄 自動failover MHA: MHA 服務 項目:搭建Mysql主從復制、MHA高可用架構 實驗項目IP地址配置: MHA下載地址 項目步驟: 一、修改主機名 二、編寫一鍵安裝mha node腳本和一鍵安裝mha mangaer腳本,并執行安裝 …

docker容器限定ip訪問

docker容器限定ip訪問 一、測試所需環境:二、使用docker的 iptables 策略三、Docker使用iptables 與系統Firewalld之間的關系四、沖突解決方案 一、測試所需環境: 主機1: ip:192.168.3.117 環境配置:docker、httpd(do…

你真的了解ORM嗎?通過一個簡單的例子來學習ORM

什么是ORM ORM(Object-Relational Mapping)是一種將面向對象程序數據模型與關系數據庫之間進行映射的技術。 比如數據庫表user,它有id、name、age字段映射到Java實體類就是User類,有id、name、age屬性。 CREATE TABLE user (id…

2023國賽 高教社杯數學建模ABCDE題思路匯總分析

文章目錄 0 賽題思路1 競賽信息2 競賽時間3 建模常見問題類型3.1 分類問題3.2 優化問題3.3 預測問題3.4 評價問題 4 建模資料 0 賽題思路 (賽題出來以后第一時間在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 競賽信息 全國大學生數學建模…

echarts加釣魚島赤尾嶼(vue)(親測有效)

1.首先引入json文件,node_modules/echarts中就有 import chinaData from "../../node_modules/echarts/map/json/china.json" 2.初始化地圖,在初始化地圖的時候加入釣魚島和赤尾嶼的數據,在chinaData下的features中加入即可&#x…

Design-Pattern設計模式

Design-Pattern設計模式 圖說設計模式 圖說設計模式 在線書籍 軟件模式是將模式的一般概念應用于軟件開發領域,即軟件開發的 總體指導思路或參照樣板。軟件模式并非僅限于設計模式,還包括 架構模式、分析模式和過程模式等,實際上&#xff…

FFmpeg常見命令行(四):FFmpeg流媒體

前言 在Android音視頻開發中,網上知識點過于零碎,自學起來難度非常大,不過音視頻大牛Jhuster提出了《Android 音視頻從入門到提高 - 任務列表》,結合我自己的工作學習經歷,我準備寫一個音視頻系列blog。本文是音視頻系…

leetcode做題筆記77組合

給定兩個整數 n 和 k,返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 思路一:直接求出組合數將每個組合放進數組中 int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {int size 0, num 1, i;in…

Rust中的智能指針:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak<T>

Rust中的智能指針是什么 智能指針(smart pointers)是一類數據結構,是擁有數據所有權和額外功能的指針。是指針的進一步發展 指針(pointer)是一個包含內存地址的變量的通用概念。這個地址引用,或 ” 指向”…

UML 類圖的畫法

1.類圖的畫法 類 整體是個矩形,第一層類名,第二層屬性,第三層方法。 :public- : private# : protected空格: 默認的default 對應的類寫法。 public class Student {public String name;public Integer age;protected I…

2023杭電第七場補題報告1002 1004 1011 1013

2023杭電第七場補題報告1002 1004 1011 1013 1002 B. Random Nim Game (hdu.edu.cn) 思路 手推一下就可以發現其實除了一次必定結束的其他情況概論都是 1 2 \frac{1}{2} 21? 代碼 #include <bits/stdc.h> using namespace std; #define int long long void solve()…

【hello C++】特殊類設計

目錄 一、設計一個類&#xff0c;不能被拷貝 二、設計一個類&#xff0c;只能在堆上創建對象 三、設計一個類&#xff0c;只能在棧上創建對象 四、請設計一個類&#xff0c;不能被繼承 五、請設計一個類&#xff0c;只能創建一個對象(單例模式) C&#x1f337; 一、設計一個類&…

Sentinel使用實例

不說了&#xff0c;直接上官方文檔 https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md Sentinel Example 項目說明 本項目演示如何使用 Sentinel starter 完成 Spring Clo…

【金融量化】對企業進行估值的方法有哪些?

估值的方法有哪些&#xff1f; 如何對企業進行估值&#xff1f;有2個方法估算。 1 絕對估值法 它是一種定價模型&#xff0c;用于計算企業的內在價值。 比如說你可以根據公司近N年的現金流情況。借此去預測未來N年的現金流情況。所有的現金流數據都可以在年報上查詢到。最后…

ios 知識

IOS 類文件.h和.m中interface的區別 大家都知道我們在創建類文件時會發現&#xff1a; #import <UIKit/UIKit.h>interface ViewController : UIViewControllerend和 #import "ViewController.h"interface ViewController ()end那么他們之間有何區別呢&#x…

【Ajax】回調地獄解決方法

回調地獄&#xff08;Callback Hell&#xff09;是指在異步編程中&#xff0c;特別是在嵌套的回調函數中&#xff0c;代碼變得深度嵌套、難以閱讀和維護的現象。這通常發生在處理多個異步操作時&#xff0c;每個操作都依賴于前一個操作的結果。回調地獄使代碼變得難以理解、擴展…

顯卡服務器適用于哪些場景

顯卡&#xff08;GPU&#xff09;服務器&#xff0c;簡單來說&#xff0c;GPU服務器是基于GPU的應用于視頻編解碼、深度學習、科學計算等多種場景的快速、 穩定、彈性的計算服務。那么壹基比小鑫告訴你顯卡服務器主要的用途有哪一些。 一、運行手機模擬器 顯卡服務器可支持…

力扣:62. 不同路徑(Python3)

題目&#xff1a; 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。 問總共有多少條不同的路徑&…

WebRTC音視頻通話-WebRTC本地視頻通話使用ossrs服務搭建

iOS開發-ossrs服務WebRTC本地視頻通話服務搭建 之前開發中使用到了ossrs&#xff0c;這里記錄一下ossrs支持的WebRTC本地服務搭建。 一、ossrs是什么&#xff1f; ossrs是什么呢&#xff1f; SRS(Simple Realtime Server)是一個簡單高效的實時視頻服務器&#xff0c;支持RTM…