08. Redis 緩存穿透和雪崩

文章目錄

  • 1. 緩存穿透(查不到導致的)
    • 1.1 概念
    • 1.2 解決方案
      • 布隆過濾器
      • 緩存空對象
  • 2. 緩存擊穿(量太大、緩存過期)
    • 2.1 概念
    • 2.2 解決方案
      • 設置熱點數據永不過期
      • 加互斥鎖
  • 3. 緩存雪崩(緩存集體失效或 Redis 宕機)
    • 3.1 概念
    • 3.2 解決方案
      • Redis 高可用
      • 限流降級
      • 數據預熱

1. 緩存穿透(查不到導致的)

1.1 概念

用戶想要查詢一個數據,發現 Redis 數據庫沒有,也就是緩存沒有命中,于是向持久層數據庫查詢,發現也沒有,于是本次查詢失敗。當用戶很多的時候(比如秒殺場景),緩存都沒有命中,于是所有用戶都去請求數據庫。這給持久層數據庫帶來了很大的壓力,這時候就相當于出現了緩存穿透

1.2 解決方案

布隆過濾器

布隆過濾器是一種數據結構,對所有可能查詢的參數以 Hash 形式存儲,在控制層先進行校驗,不符合要求的就丟棄,從而避免了對底層存儲系統的壓力。

緩存空對象

當存儲層不命中后,即使返回空對象也將其緩存起來,同時會設置一個過期時間。這樣的話,之后再訪問這個數據的時候將會從緩存中取出,保護了后端數據源。

存在的問題:

  • 如果空值能夠被緩存起來,這意味著緩存需要更多的空間存儲這些數據,而其中很多數據的值是空的。

2. 緩存擊穿(量太大、緩存過期)

2.1 概念

緩存擊穿,是指一個 key 非常的熱點,在不停的扛著大并發,大并發集中對這一個點進行訪問。當這個 key 在失效的瞬間,持續的大并發就穿破緩存,直接請求數據庫,導致數據庫瞬間壓力過大。

2.2 解決方案

設置熱點數據永不過期

從緩存層面來看,熱點數據不設置過期時間,就不會出現熱點數據過期導致的緩存擊穿。(一直緩存浪費緩存空間)

加互斥鎖

使用分布式鎖,保證對于每個 key 同時只有一個線程去查詢后端服務,其他線程沒有獲得分布式鎖的權限,等待即可。

這種方式將高并發的壓力轉移到了分布式鎖。

3. 緩存雪崩(緩存集體失效或 Redis 宕機)

3.1 概念

緩存雪崩,是指在某一個時間段,緩存集體過期失效或者 Redis 宕機。于是所有的請求都會到達存儲層,存儲層的調用量會暴增,造成存儲層掛掉的情況。

比如雙十一零點搶購商品,搶購的商品肯定集中放在了緩存,假設緩存一個小時。那么到一點的時候,這批商品的緩存都到期了,這時候對這批商品的查詢,都落到了數據庫上。

3.2 解決方案

Redis 高可用

這個思想就是,既然 Redis 有可能掛掉,那我就多增設幾臺 Redis 服務器,其實就是搭建 Redis 集群。

限流降級

這個方案的思想是,在緩存失效后,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。

數據預熱

數據預熱的含義就是,在正式部署之前,先把可能訪問的數據預先訪問一遍,這樣部分可能大兩房問的數據就會先加載到緩存中。在即將發生大并發訪問之前,手動觸發加載緩存不同的 key,設置不同的過期時間,讓緩存失效的時間點盡量均勻

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

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

相關文章

說一下你對dom驅動和數據驅動的理解

DOM驅動和數據驅動是前端開發中兩種常見的操作方式,尤其在構建用戶界面時。下面,我將分別解釋這兩種驅動方式,并提供詳細的代碼示例。 DOM驅動 DOM驅動的核心思想是直接操作DOM元素來更新用戶界面。在早期的Web開發中,這種方式非…

Linux指令初識

ls:顯示當前目錄底下的指定文件或目錄 ls -l更詳細的信息 ls -a顯示當前目錄下的所有文件 命令中的選項可以一次傳遞多個 ,例如:ls -al 命令和選項有必須一個或多個空格 以.開頭的文件,為隱藏文件ls -a可以看到,ls -l看不見 支持命令拼在一起&#…

牛客熱題:滑動窗口的最大值

📟作者主頁:慢熱的陜西人 🌴專欄鏈接:力扣刷題日記 📣歡迎各位大佬👍點贊🔥關注🚓收藏,🍉留言 文章目錄 牛客熱題:滑動窗口的最大值題目鏈接方法一…

DNS服務的部署與配置(2)

1、dns的安裝及開啟 dnf install bind.x86_64 -y #安裝 #Berkeley Internet Name Domain (BIND) systemctl enable --now named #啟用dns服務,服務名稱叫named firewall-cmd --permanent --add-servicedns #火墻設置 firewall-cmd --reload …

【手把手搓組件庫】從零開始實現Element Plus--組件開發

從零開始實現Element Plus--組件開發 nvmnvm的作用:nvm的使用方法 需求分析提示詞Kimi 生成產品需求文檔kimi 生成測試用例 初始化 vitest完善 Button 組件1、定義 types.ts2、Button.vue 引入 types.ts3、添加Button樣式點擊事件 添加節流添加 Icon 集成 StoryBook…

C++第十九彈---string模擬實現(下)

?個人主頁: 熬夜學編程的小林 💗系列專欄: 【C語言詳解】 【數據結構詳解】【C詳解】 目錄 1、修改操作 2、迭代器操作 3、字符串操作 4、非成員函數重載操作 總結 1、修改操作 1、string& operator (const char* s); //尾部插入…

【Text2SQL 論文】SeaD:使用 Schema-aware 去噪訓練的 end2end 的 Text2SQL

論文:SeaD: End-to-end Text-to-SQL Generation with Schema-aware Denoising ?? NAACL 2022, arXiv:2105.07911 本論文提出 SeaD 模型,使用 schema-aware 的去噪方法來訓練一個 end2end、seq2seq 的 Transformer 模型來實現 Text2SQL。 一、論文速讀…

C++系列-static成員

🌈個人主頁:羽晨同學 💫個人格言:“成為自己未來的主人~” 概念 聲明為static的類成員稱為類的靜態成員,用static修飾的成員變量,稱之為靜態成員變量,用static修飾的成員函數,稱之為靜態成…

stm32學習-流水燈

接線 注意:LED燈長一點的引腳是正極。 配置GPIO 1.使用RCC開啟GPIO時鐘 void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); void RCC_APB1Perip…

Stanford斯坦福 CS 224R: 深度強化學習 (2)

實用深度強化學習實現技術 強化學習(RL)是一種通過智能體與環境交互來學習最優決策的機器學習范式。而深度強化學習(DRL)則將深度學習技術引入RL領域,利用深度神經網絡強大的函數擬合能力來處理高維觀察空間,取得了顯著的成功。本章我們將重點介紹一種經典的DRL算法:Q-Learnin…

【Qt 學習筆記】Qt窗口 | 菜單欄 | QMenuBar的使用及說明

博客主頁:Duck Bro 博客主頁系列專欄:Qt 專欄關注博主,后期持續更新系列文章如果有錯誤感謝請大家批評指出,及時修改感謝大家點贊👍收藏?評論? Qt窗口 | 菜單欄 | QMenuBar的使用及說明 文章編號:Qt 學習…

第20屆文博會:“特別呈現”—周瑛瑾雷米·艾融雙個展,著名美術評論家,批評家彭德教授對周瑛瑾作品進行評論

周瑛瑾不是學院派藝術家,但在彩墨畫領域的天賦超出中國八大美院的同類型畫家。相比具有批判意識的當代藝術,他的彩墨藝術如同我們這個苦難世界的創可貼和安慰劑。當我面對他的彩墨畫,首先是驚艷,隨之想到屈原的離騷,還…

無源相控陣雷達

什么是無源相控陣雷達 無源相控陣雷達(Passive Electronically Scanned Array Radar,簡稱PESA雷達)是一種雷達系統。這里的“無源”并未指其不發射信號,而是指其陣列單元不會產生并發射信號,其特點在于天線表面的陣列…

Vue與React、Angular的比較

Vue、React和Angular是前端開發中三個流行的JavaScript框架,它們各自具有不同的特點、優勢和適用場景。以下是對這三個框架的比較: 1. 基本概念 Vue:Vue是一套用于構建用戶界面的漸進式框架,其核心庫專注于視圖層,易…

[CISCN 2024] Crypto部分復現

文章目錄 OvOez_rsacheckin淺記一下 遲來的文章 OvO 題目描述: from Crypto.Util.number import * from secret import flagnbits 512 p getPrime(nbits) q getPrime(nbits) n p * q phi (p-1) * (q-1) while True:kk getPrime(128)rr kk 2e 65537 kk …

【三維修復、分割與編輯】InFusion、Bootstrap 3D、GaussianGrouping、GaussianEditor等(論文總結)

提示: 文章目錄 前言一、InFusion:擴散模型助力,效率提高20倍!(2024)1. 摘要2. 算法3. 效果 二、2D Gaussian Splatting三、Bootstrap 3D:從擴散模型引導三維重建1.摘要2.相關工作3.方法1.Boostrapping by Diffusion 通過擴散模型…

學習存儲協議的利器,聊聊tcpdump和Wireshark

數據存儲技術分為多個方面,包括數據持久化、數據映射、數據壓縮和通信協議等等。其中通信協議是數據存儲技術中非常重要的一部分,正是通信協議使得計算節點可以訪問存儲設備。同時,也正是不同的協議讓存儲系統呈現不同的形態。 如下圖所示,通過iSCSI協議,可以將存儲端的存…

使用std::vector<char>作為數據緩沖區分析

文章目錄 0. 引言1. 內存分配分析2. 性能影響3. 性能優化策略4. 實際性能測試5. 優化建議6. 總結額外建議 0. 引言 在 C 網絡編程中&#xff0c;std::vector<char> 常被用作數據緩沖區。與普通數組相比&#xff0c;std::vector 的內存分配在堆上&#xff0c;而非棧上&am…

【JVM實踐與應用】

JVM實踐與應用 1.類加載器(加載、連接、初始化)1.1 類加載要完成的功能1.2 加載類的方式1.3 類加載器1.4 雙親委派模型1.5自定義ClassLoader1.6 破壞雙親委派模型2.1 類連接主要驗證內容2.2 類連接中的解析2.3 類的初始化3.1 類的初始化時機3.2 類的初始化機制和順序3.2 類的卸…

C從零開始實現貪吃蛇大作戰

個人主頁&#xff1a;星紜-CSDN博客 系列文章專欄 : C語言 踏上取經路&#xff0c;比抵達靈山更重要&#xff01;一起努力一起進步&#xff01; 有關Win32API的知識點在上一篇文章&#xff1a; 目錄 一.地圖 1.控制臺基本介紹 2.寬字符 1.本地化 2.類項 3.setlocale函…