緩存三大問題及其解決方案

緩存三大問題及其解決方案

1. 前言

? 在現代系統架構中,緩存與數據庫的結合使用是一種經典的設計模式。為了確保緩存中的數據與數據庫中的數據保持一致,通常會給緩存數據設置一個過期時間。當系統接收到用戶請求時,首先會訪問緩存。如果緩存中不存在所需數據,系統會進一步查詢數據庫,并將獲取到的數據回寫到緩存中。這樣,當系統再次接收到相同的請求時,便可以直接從緩存中獲取數據并返回給用戶,從而提升系統的響應速度和性能。

緩存與數據庫交互示意圖

2. 緩存穿透

? 在上述系統架構中,當用戶從緩存中獲取數據時,如果緩存中不存在該數據,系統會轉而查詢數據庫。然而,如果數據庫中也不存在該數據,系統將無法將數據回寫到緩存中。這導致后續相同的請求仍然會直接訪問數據庫。如果短時間內系統接收到大量此類請求,數據庫的壓力將急劇增加,甚至可能導致數據庫服務器宕機。

緩存穿透示意圖

2.1 解決方案
  1. 限制非法請求

    ? 緩存穿透問題往往是由于惡意攻擊(如黑客攻擊)導致的。因此,我們可以在API入口處對請求的合法性進行檢測。例如,可以檢查請求的IP地址、參數和字段的合法性。如果請求被判定為非法,系統可以直接返回錯誤響應,而無需進一步訪問緩存或數據庫。

  2. 緩存空值或默認值

    ? 當請求的數據在緩存和數據庫中均不存在時,系統可以將該數據的鍵值對緩存起來,并將其值設置為空或賦予一個默認值。這樣,當系統再次接收到相同的請求時,便可以直接從緩存中獲取數據并返回,從而避免了對數據庫的重復查詢。

  3. 使用布隆過濾器

    ? 布隆過濾器是一種高效的數據結構,用于判斷某個元素是否存在于集合中。我們可以在寫入數據庫數據時,同步將該數據的標識存入布隆過濾器中。當系統接收到用戶請求時,如果緩存中不存在該數據,系統可以先查詢布隆過濾器。如果布隆過濾器中也不存在該數據,系統可以直接返回,而無需訪問數據庫。這種方法能夠有效減少數據庫的查詢壓力,尤其是在面對大量請求時。

3. 緩存雪崩

? 通常情況下,緩存中的數據會設置一個過期時間,以便及時更新數據,確保與數據庫中的數據保持一致。然而,如果大量緩存在同一時間過期,系統將無法從緩存中獲取數據,導致大量請求直接涌入數據庫。這種情況下,數據庫的壓力將急劇增加,甚至可能導致數據庫崩潰。

緩存雪崩示意圖

3.1 解決方案
  1. 均勻設置過期時間

    ? 為了避免大量緩存在同一時間過期,可以為緩存數據設置隨機的過期時間。通過均勻分布緩存的過期時間,可以有效避免緩存同時失效,從而減輕數據庫的壓力。

  2. 使用互斥鎖

    ? 當系統接收到用戶請求時,如果請求的數據不在緩存中,系統可以為該請求加一個互斥鎖,確保同一時間內只有一個請求能夠訪問數據庫。當數據庫中的數據被成功查詢并回寫到緩存后,系統再釋放該鎖。其他請求在緩存中獲取不到數據時,可以選擇等待鎖釋放或直接返回空值或默認值。

    ? 需要注意的是,互斥鎖應設置一個合理的過期時間,以防止因異常情況導致鎖無法釋放。

  3. 后臺線程更新緩存

    ? 當系統接收到用戶請求時,如果請求的數據不在緩存中,系統可以調用后臺線程或通過消息隊列觸發后臺線程來更新緩存。后臺線程會首先檢查緩存中是否存在該數據,如果存在則不執行更新操作;如果不存在,則從數據庫中獲取數據并回寫到緩存中。

    ? 在系統剛上線時,可以通過手動調用后臺線程,將部分熱點數據預先加載到緩存中,以避免冷啟動時的大量數據庫查詢。

4. 緩存擊穿

? 在秒殺等高頻訪問場景中,某些熱點數據會被頻繁訪問。如果這些熱點數據恰好過期,大量請求將無法從緩存中獲取數據,轉而直接訪問數據庫。這種情況下,數據庫的壓力將急劇增加,甚至可能導致數據庫崩潰。

緩存擊穿示意圖

4.1 解決方案

? 緩存擊穿可以視為緩存雪崩的一種特殊情況,因此其解決方案與緩存雪崩類似。

  1. 使用互斥鎖

    ? 當系統在緩存中無法獲取到數據時,可以為該請求加一個互斥鎖,并設置合理的過期時間。這樣可以確保同一時間內只有一個請求能夠訪問數據庫,從而避免大量請求同時涌入數據庫。

  2. 后臺線程更新緩存

    ? 當系統在緩存中無法獲取到數據時,可以調用后臺線程來更新緩存。后臺線程會從數據庫中獲取數據并回寫到緩存中。在系統剛上線時,可以通過預熱機制將部分熱點數據預先加載到緩存中,以避免緩存擊穿問題。

5. 總結

? 緩存穿透、緩存雪崩和緩存擊穿是緩存系統中常見的三大問題。通過合理設置緩存過期時間、使用互斥鎖、布隆過濾器以及后臺線程更新緩存等策略,可以有效緩解這些問題,提升系統的穩定性和性能。在實際應用中,應根據具體業務場景選擇合適的解決方案,以確保系統的高效運行。

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

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

相關文章

【算法】----多重背包問題I,II(動態規劃)

🌹作者:云小逸 📝個人主頁:云小逸的主頁 📝Github:云小逸的Github 🤟motto:要敢于一個人默默的面對自己,強大自己才是核心。不要等到什么都沒有了,才下定決心去做。種一顆樹,最好的時間是十年前…

LeetCode-524. 通過刪除字母匹配到字典里最長單詞

1、題目描述: 給你一個字符串 s 和一個字符串數組 dictionary ,找出并返回 dictionary 中最長的字符串,該字符串可以通過刪除 s 中的某些字符得到。 如果答案不止一個,返回長度最長且字母序最小的字符串。如果答案不存在&#x…

TikTok賬戶安全指南:如何取消兩步驗證?

TikTok賬戶安全指南:如何取消兩步驗證? 在這個數字化的時代,保護我們的在線賬戶安全變得尤為重要。TikTok,作為全球流行的社交媒體平臺,其賬戶安全更是不容忽視。兩步驗證作為一種增強賬戶安全性的措施,雖…

面試題之箭頭函數和普通函數有什么區別?

箭頭函數(Arrow Function)和普通函數(Regular Function)是 JavaScript 中兩種不同的函數定義方式,它們在語法、上下文(this)、原型鏈等方面存在顯著區別。以下是它們的主要區別: 1. …

Llama 3.1 本地電腦部署 Linux系統 【輕松簡易】

本文分享在自己的本地電腦部署 llama3.1,而且輕松簡易,快速上手。 這里借助Ollama工具,在Linux系統中進行大模型部署~ Llama3.1,有三個版本:8B、70B、405B Llama 3.1 405B 是第一個公開可用的模型,在常識…

工業安全的智能哨兵:AI如何筑起生產線的“數字防火墻“

工業安全的智能哨兵:AI如何筑起生產線的"數字防火墻" (本文共1420字,閱讀約需4分鐘) 去年某石化廠的反應釜壓力數據出現異常波動,傳統監測系統在15分鐘后才發出警報——而AI模型在23秒前就已預警。這場未遂事故揭示了一個殘酷現實:工業安全監測正在經歷從&qu…

【Bert】自然語言(Language Model)入門之---Bert

every blog every motto: Although the world is full of suffering, it is full also of the overcoming of it 0. 前言 對bert進行梳理 論文: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 時間:…

Linux中使用Docker安裝DIFY搭建本地支持庫和Agent

Dify 是一款開源的大語言模型(LLM) 應用開發平臺。它融合了后端即服務(Backend as Service)和 LLMOps 的理念,使開發者可以快速搭建生產級的生成式 AI 應用。即使你是非技術人員,也能參與到 AI 應用的定義和數據運營過程中。 然而…

開源工具推薦--思維導圖、流程圖等繪制

1. 前言 在工作中,經常要用到各種不同的工具,隨著系統的升級,有些工具也在不斷更新升級。這里收集整理一些好用的開源工具推薦,遵循以下一些基本原則:開源免費,商業工具的有效平替,輕量級&…

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_create_pool函數

ngx_create_pool 聲明在 src\core\ngx_palloc.h 中 ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log); 實現在 src\core\ngx_palloc.c 中 ngx_pool_t * ngx_create_pool(size_t size, ngx_log_t *log) {ngx_pool_t *p;p ngx_memalign(NGX_POOL_ALIGNMENT, size, lo…

ac的dhcp池里option43配錯導致ap無法上線問題排查過程

dhcp池里ac地址配錯,導致ap無法上線問題排查過程 問題:ap手動設置ac的ip正常注冊在線,但dhcp獲得ip和ac地址發現無法在ac上注冊成功。 組網: ac旁路結構,路由器lan口地址172.16.1.1,開dhcp服務&#xff0…

IntelliJ IDEA中Maven配置全指南

一、環境準備與基礎配置 1.1 Windows 環境下載并配置 Maven 見此篇博文:環境配置 1.2 IDEA配置步驟 打開設置面板:File → Settings → Build → Build Tools → Maven 關鍵配置項: Maven home path E:\apache-maven-3.9.9 (…

存儲區域網絡(SAN)管理

存儲區域網絡(Storage Area Network,SAN)采用網狀通道(Fibre Channel ,簡稱FC)技術,通過FC交換機連接存儲陣列和服務器主機,建立專用于數據存儲的區域網絡。SAN提供了一種與現有LAN連…

使用vue-office報錯TypeError: ft.createElementVNode is not a function

支持多種文件(.docx、.xlsx、.xls、.pdf、.pptx)預覽的vue組件庫,支持vue2/3。也支持非Vue框架的預覽。 不支持.doc、.ppt(2003年及以前的版本) 官網:https://www.npmjs.com/package/vue-office/excel?activeTabreadme 官方有實…

Ubuntu部署ktransformers

準備工作 一臺服務器 CPU:500G GPU:48G(NVIDIA4090) 系統:Ubuntu20.04(github的文檔好像用的是22.04) 第一步:下載權重文件 1.下載hfd wget https://hf-mirror.com/hfd/hfd.s…

C++初階——簡單實現vector

目錄 1、前言 2、Vector.h 3、Test.cpp 1、前言 簡單實現std::vector類模板。 相較于前面的string,vector要注意: 深拷貝,因為vector的元素可能是類類型,類類型元素可以通過賦值重載,自己實現深拷貝。 迭代器失效…

全志A133 android10 適配SLM770A 4G模塊

一,模塊基本信息 1.官方介紹 SLM770A是美格智能最新推出的一款LTE Cat.4無線通訊模組,最大支持下行速率150Mbps及上行速率50Mbps。同時向下兼容現有的3G和2G網絡,以確保即使在偏遠地區也可以進行網絡通信。 SLM770A模組支持分集接收和MIMO技…

微信小程序:多菜單欄設計效果

一、實現效果 二、代碼 wxml 編輯前端界面,步驟 菜單邏輯: 逐步取出數組中的項,首先取出頂部菜單項,然后選中后取出選中的底部數據(左側菜單+右側內容),然后點擊左側菜單取出選中的左側菜單對應的右側內容 ①這里我的數據是全部封裝到一個數組對象的,首先我的循環…

C++基礎知識學習記錄—string類

string實際上是C內置的一個類,內部對char *進行了封裝,不用擔心數組越界問題,string類中,除了上課講解的函數外,還有很多函數可以使用,可以自行查閱文檔。 構造函數原型: string(); //創建一個…

Ollama+DeepSeek+Open-WebUi

環境準備 Docker Ollama Open-WebUi Ollama 下載地址:Ollama docker安裝ollama docker run -d \ -v /data/ollama/data:/root/.ollama \ -p 11434:11434 \ --name ollama ollama/ollama 下載模型 Ollama模型倉庫 # 示例:安裝deepseek-r1:7b doc…