緩存雪崩 緩存擊穿 緩存穿透

1. redis使用場景-緩存-緩存穿透

在實際開發中,Redis 被廣泛應用于緩存,以提高系統性能和響應速度。然而,在使用緩存時,需要注意一些問題,其中 緩存穿透 是一個常見且需要重點關注的場景。

什么是緩存穿透

● 緩存穿透 指查詢一個在緩存和數據庫中都不存在的數據, 導致請求直接訪問數據庫,繞過了緩存層的保護。這種情況可能由以下原因引起:
○ 惡意攻擊或爬蟲頻繁請求不存在的數據。
○ 業務邏輯錯誤,導致請求了無效的數據。
緩存穿透會增加數據庫的負載,降低系統性能,甚至可能導致數據庫宕機。

如何防止緩存穿透?

● 為了解決緩存穿透問題,常用的策略包括:

  1. 緩存空對象:
    ● 當查詢的數據不存在時,將一個空對象(如 null)存入緩存。這樣,下次請求相同的數據時,直接從緩存中獲取,避免再次訪問數據庫。
    ● 優點:實現簡單,維護方便。
    ● 缺點:會占用額外的內存空間,可能導致短期內的數據不一致。
  2. 使用布隆過濾器:
    ● 布隆過濾器是一個高效的概率數據結構,可以快速判斷某個元素是否存在。它可以在請求數據庫之前,先通過布隆過濾器判斷數據是否可能存在于數據庫中。
    ● 優點:內存占用少,避免了緩存空對象帶來的額外內存消耗。
    ● 缺點:實現較為復雜,可能存在誤判的情況。
  3. 使用白名單:
    ● 維護一個白名單,將所有合法的數據標識存入其中。查詢時,先檢查請求的數據是否在白名單中,如果不在,直接返回,避免訪問數據庫。

2. redis使用場景-緩存-緩存擊穿

緩存擊穿是另一個在使用 Redis 緩存時需要特別注意的問題,它通常發生在高并發環境下,尤其是在熱點數據的情況下。

什么是緩存擊穿

緩存擊穿是指當某個緩存中的數據失效后,多個請求并發訪問該數據時,所有請求都會去訪問數據庫,造成數據庫壓力暴增。具體來說,當緩存中的某個數據被刪除或過期時,如果多個請求在同一時刻請求這個數據,所有的請求都將直接訪問數據庫,導致緩存的作用失效,增加了數據庫的壓力。

緩存擊穿的典型場景

  1. 緩存過期:
    ● 緩存的數據過期后,多個請求同時到達,發現緩存為空,都會觸發訪問數據庫的操作,造成大量的數據庫請求。
  2. 熱點數據:
    ● 如果某個數據是非常熱門的數據(比如某個商品的詳情頁,或者某個頁面的訪問量極高),它在緩存過期時,可能會有成千上萬的請求同時過來。因為緩存失效后,數據庫的壓力急劇增加,可能導致數據庫崩潰。

緩存擊穿的影響

● 數據庫壓力增大:由于所有請求都直接訪問數據庫,數據庫可能會承受過高的負載,甚至可能因高并發請求而崩潰。
● 系統響應時間變慢:在高并發請求下,數據庫響應時間變慢,用戶體驗受到影響。
● 資源浪費:多次查詢相同的數據,浪費了系統資源和數據庫的處理能力。

如何解決緩存擊穿

  1. 使用互斥鎖(Mutex)
    ● 通過 分布式鎖(如 Redis 的 SETNX)來控制同一時刻只有一個請求可以去數據庫拉取數據,其他的請求都等待數據庫的響應,之后把數據緩存到 Redis。
    ● 步驟:
    ○ 請求到達時,發現緩存沒有數據,嘗試獲取鎖。
    ○ 獲取鎖的請求去查詢數據庫并緩存數據,其他請求等待。
    ○ 等待中的請求等到數據庫返回數據后,再從緩存中取數據。
    ● 優點:可以確保在緩存失效時,只有一個請求會查詢數據庫,避免了緩存擊穿。
    ● 缺點:鎖的獲取和釋放需要一定的時間,可能會帶來一些性能開銷,且如果鎖無法及時釋放(如代碼異常等情況),可能會導致請求阻塞。
  2. 使用緩存預熱:
    ● 緩存預熱是一種提前將熱點數據加載到緩存的策略。例如,緩存可以在系統啟動時或者數據更新時預先加載這些熱點數據,這樣在真實請求到來之前,緩存就已經準備好,不會發生緩存擊穿。
    ● 優點:減少了緩存失效帶來的數據庫負擔。
    ● 缺點:需要有明確的熱點數據預知,且預熱的操作需要額外的開發和維護。
  3. 設置緩存的過期時間(TTL)策略:
    ● 為緩存數據設置合理的過期時間,使得不同數據的緩存過期時間盡量錯開,避免在同一時間段內大量數據同時失效,造成緩存擊穿。
    ● 優點:避免緩存過期同時失效,平衡數據庫的壓力。
    ● 缺點:雖然可以避免擊穿,但需要根據數據的訪問頻率和生命周期合理配置 TTL。
  4. 緩存異步加載:
    ● 當緩存失效時,可以先返回一個默認值(如空對象或默認數據),然后在后臺異步加載數據并更新緩存。這樣即使多個請求同時來,緩存仍然會有一個初始值返回,而不會直接查詢數據庫。
    ● 優點:減少了數據庫的壓力,提高了系統的響應速度。
    ● 缺點:實現復雜度較高,可能會出現“臟數據”,需要保證異步更新數據的準確性。

緩存擊穿在實際工作中的應用

  1. 電商系統:
    ● 在電商平臺中,某些熱門商品的頁面(如秒殺商品或限時折扣商品)通常會產生大量請求。如果緩存中沒有及時更新熱點商品的庫存信息或價格信息,所有請求就會同時訪問數據庫,造成數據庫壓力。
    ● 解決方案:可以使用分布式鎖來確保只有一個請求會訪問數據庫,其他請求會等待。
  2. 社交平臺:
    ● 用戶的動態信息、熱門話題等數據可能在某一時間內迅速過時或失效,導致大量用戶請求數據庫,數據庫可能因并發請求過多而崩潰。
    ● 解決方案:可以通過合理的緩存失效策略和緩存預熱來避免高并發請求數據庫。
  3. 新聞網站:
    ● 一些熱點新聞在發布后的短時間內會引起大量訪問,如果緩存失效時,可能會導致數據庫的高并發查詢。
    ● 解決方案:除了緩存的過期控制,還可以通過緩存預熱來提前加載熱門新聞的數據。

3. 緩存穿透和緩存擊穿 的區別

根本原因就是定義不同

定義問題出處
緩存穿透問題的根源在于請求的數據本身不在數據庫中 。問題出在查詢的數據是否有效,或者請求是否合規。
緩存擊穿問題的根源在于緩存中的數據失效了,導致大量請求并發查詢數據庫。數據是有效的,只是緩存沒有及時恢復,所以請求會直接穿透緩存去訪問數據庫,導致數據庫壓力增大。

4. redis使用場景-緩存-緩存雪崩

Redis作為緩存系統,緩存雪崩是一個常見的問題,特別是在高并發的情況下。
緩存雪崩

緩存雪崩指的是在某一時刻,緩存系統中大量的緩存失效(比如緩存同時過期)或緩存服務器宕機,導致大量的請求直接訪問數據庫,從而造成數據庫的巨大壓力,最終可能導致數據庫崩潰。

發生場景

  1. 緩存同時過期:如果緩存中的大量數據在同一時間點過期,客戶端會發送大量的請求到數據庫,導致數據庫壓力暴增。
  2. 緩存失效機制不合理:如果緩存的失效時間設置不合理,可能導致大量緩存數據在同一時間點過期,或者緩存沒有有效的預加載機制。
    應對緩存雪崩的策略
  3. 設置不同的緩存過期時間:可以通過給不同的緩存設置不同的過期時間,避免緩存同時過期的情況。通常可以為緩存設置一定的隨機過期時間。
  4. 使用加鎖機制:當緩存數據失效時,通過鎖機制確保只有一個請求能去加載數據,避免多個請求同時訪問數據庫。可以使用Redis的SETNX命令來實現分布式鎖。
  5. 預加載緩存:通過提前加載緩存的方式,避免緩存空缺。比如定時任務定時加載緩存,確保緩存中數據的穩定性。
  6. 使用雙重檢查:當緩存失效時,可以在代碼中做兩次檢查。第一次檢查緩存,如果緩存為空,則去數據庫加載數據并緩存;如果數據已經被加載緩存,再次檢查時直接返回緩存結果。

區別總結

問題定義原因應對策略
緩存雪崩緩存中的大量數據在同一時間失效,造成大量請求直接訪問數據庫。緩存大量數據過期或緩存服務器宕機。設置不同的過期時間、使用加鎖機制、定時更新緩存。
緩存擊穿某個高頻訪問的緩存數據失效,導致數據庫瞬時壓力過大。高頻訪問的數據緩存失效。使用加鎖機制、防止多個請求同時訪問數據庫、提前更新緩存。
緩存穿透請求查詢的數據在緩存和數據庫中都不存在,導致頻繁訪問數據庫。請求數據不存在,或者惡意攻擊導致頻繁查詢數據庫。緩存空數據、請求過濾、使用布隆過濾器等避免不必要的查詢。

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

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

相關文章

【YOLOv12改進trick】多尺度大核注意力機制MLKA模塊引入YOLOv12,實現多尺度目標檢測漲點,含創新點Python代碼,方便發論文

??改進模塊??:多尺度大核注意力機制(MLKA) ??解決問題??:MLKA模塊結合多尺度、門控機制和空間注意力,顯著增強卷積網絡的模型表示能力。 ??改進優勢??:超分辨的MLKA模塊對小目標和模糊目標漲點很明顯 ??適用場景??:小目標檢測、模糊目標檢測等 ??思路…

better-sqlite3之exec方法

在 better-sqlite3 中,.exec() 方法用于執行包含多個 SQL 語句的字符串。與預編譯語句相比,這種方法性能較差且安全性較低,但有時它是必要的,特別是當你需要從外部文件(如 SQL 腳本)中執行多個 SQL 語句時。…

電路基礎:【1】PN結二極管制作電橋點亮LED燈

第一章:PN結二極管制作電橋點亮LED燈 文章目錄 第一章:PN結二極管制作電橋點亮LED燈前言一、電路原理二、電路圖與元器件1.電路圖 做實驗總結 前言 在本章中,我們將探討如何通過PN結二極管制作電橋電路,并利用該電路點亮LED燈。L…

XHR請求解密:抓取動態生成數據的方法

在如今動態頁面大行其道的時代,傳統的靜態頁面爬蟲已無法滿足數據采集需求。尤其是在目標網站通過XHR(XMLHttpRequest)動態加載數據的情況下,如何精準解密XHR請求、捕獲動態生成的數據成為關鍵技術難題。本文將深入剖析XHR請求解密…

機器學習數學基礎:42.AMOS 結構方程模型(SEM)分析的系統流程

該流程圖完整呈現了 AMOS 結構方程模型(SEM)分析的系統流程,具體步驟及內涵如下: 1. 模型設定 基于理論基礎或研究假設,構建結構方程模型的初始框架,明確潛變量與顯變量的關系、測量模型(因子…

以太網通訊

接口開發筆記-WebApi-CSDN博客 以太網常用通訊協議 1、modbus tcp using EasyModbus; using System;class Program {static void Main(string[] args){// 創建Modbus客戶端實例ModbusClient modbusClient new ModbusClient("192.168.1.100"); // IP地址modbusCli…

Arcgis中添加腳本工具箱

文章目錄 準備資料1、打開arcmap2、找到目錄窗口3、復制粘貼工具箱的路徑4、添加或者確認python腳本路徑準備資料 (1)工具箱 (2)python腳本 1、打開arcmap 2、找到目錄窗口 3、復制粘貼工具箱的路徑 4、添加或者確認python腳本路徑 腳本上右鍵屬性(注意:腳本內容和路徑…

TDengine SQL查詢語法

簡介 TDengine 中的查詢 SQL 基本遵循 MYSQL 的查詢語法,大部分查詢都是通過超級表按時間維度進行的各種查詢。 TDengine 時序數據庫以時間為主索引列進行數據組織排序及存儲,同時按存儲塊做了預計算,所以在無普通列過濾的 SQL 查詢語句中聚…

Apache nifi demo 實驗

Apache nifi 是個數據流系統,可以通過配置 自定義的流程來實現數據的轉換。 比如可以配置一個流程,讀取數據庫里的數據,再轉換,最后保存到本地文件。 這樣可以來實現一些數據轉換的操作,而不用特地編寫程序來導入導出。…

javascript一些原生方法記錄

Element.scrollIntoView() Element 接口的 scrollIntoView() 方法會滾動元素的父容器,使被調用 scrollIntoView() 的元素對用戶可見。 structuredClone() 方法 Window 接口的 structuredClone() 方法使用結構化克隆算法將給定的值進行深拷貝。

記一次ScopeSentry搭建

介紹 Scope Sentry是一款具有資產測繪、子域名枚舉、信息泄露檢測、漏洞掃描、目錄掃描、子域名接管、爬蟲、頁面監控功能的工具,通過構建多個節點,自由選擇節點運行掃描任務。當出現新漏洞時可以快速排查關注資產是否存在相關組件。 目前功能 插件系…

Spring提供的SPEL表達式

SPEL 1. 概述 SpEL是Spring框架中用于表達式語言的一種方式。它類似于其他編程語言中的表達式語言,用于在運行時計算值或執行特定任務。 SpEL提供了一種簡單且強大的方式來訪問和操作對象的屬性、調用對象的方法,以及實現運算、條件判斷等操作。它可以…

【Azure 架構師學習筆記】- Azure Databricks (14) -- 搭建Medallion Architecture part 2

本文屬于【Azure 架構師學習筆記】系列。 本文屬于【Azure Databricks】系列。 接上文 【Azure 架構師學習筆記】- Azure Databricks (13) – 搭建Medallion Architecture part 1 前言 上文搭建了ADB 與外部的交互部分,本篇搭建ADB 內部配置來滿足medallion 架構。…

vulnhub靶場之【digitalworld.local系列】的torment靶機

前言 靶機:digitalworld.local-torment,IP地址為192.168.10.12 攻擊:kali,IP地址為192.168.10.6 kali采用VMware虛擬機,靶機選擇使用VMware打開文件,都選擇橋接網絡 這里官方給的有兩種方式&#xff0c…

docker-compose部署mongodb副本集集群

生成密鑰文件 ? openssl rand -base64 756 > mongodb.key chmod 400 mongodb.key # 權限必須為400?:ml-citation{ref="4" data="citationList"} chown 999:999 mongodb.key # MongoDB容器用戶ID為999?:ml-citation{ref="4" data="…

k8s v1.28.15部署(kubeadm方式)

k8s部署(kubeadm方式) 部署環境及版本 系統版本:CentOS Linux release 7.9.2009 k8s版本:v1.28.15 docker版本:26.1.4 containerd版本:1.6.33 calico版本:v3.25.0準備 主機ip主機名角色配置1…

Redis特性總結

一、速度快 正常情況下,Redis 執?命令的速度?常快,官?給出的數字是讀寫性能可以達到 10 萬 / 秒,當然這也取決于機器的性能,但這?先不討論機器性能上的差異,只分析?下是什么造就了 Redis 如此之快,可以…

C# Unity 面向對象補全計劃 之 索引器與迭代器

本文僅作學習筆記與交流,不作任何商業用途,作者能力有限,如有不足還請斧正 本篇有部分內容出自唐老獅,唐老師網站指路:全部 - 游習堂 - 唐老獅創立的游戲開發在線學習平臺 - Powered By EduSoho 目錄 1.索引器 2.迭代器 1.索引器 我的理解 索…

深度學習PyTorch之13種模型精度評估公式及調用方法

深度學習pytorch之22種損失函數數學公式和代碼定義 深度學習pytorch之19種優化算法(optimizer)解析 深度學習pytorch之4種歸一化方法(Normalization)原理公式解析和參數使用 深度學習pytorch之簡單方法自定義9類卷積即插即用 實時…

C++ Primer 拷貝控制和資源管理

歡迎閱讀我的 【CPrimer】專欄 專欄簡介:本專欄主要面向C初學者,解釋C的一些基本概念和基礎語言特性,涉及C標準庫的用法,面向對象特性,泛型特性高級用法。通過使用標準庫中定義的抽象設施,使你更加適應高級…