【Redis】緩存三劍客問題實踐(上)

本篇對緩存三劍客問題進行介紹和解決方案說明,下篇將進行實踐,有需要的同學可以跳轉下篇查看實踐篇:(待發布)

緩存三劍客是什么?

????????緩存三劍客指的是在分布式系統下使用緩存技術最常見的三類典型問題。它們分別是:

  • 緩存穿透:請求不存在的數據。

  • 緩存擊穿:熱點數據突然過期。

  • 緩存雪崩:大量數據同時過期。

????????三種問題都會導致緩存失效,對數據庫造成巨大壓力,可能會導致數據庫崩潰,引發系統性崩潰。所以說,學會如何預防和解決這三種問題顯得尤為重要。


緩存穿透問題

問題描述

????????緩存穿透問題指的是:當用戶訪問的數據即不在緩存中,又不在數據庫中,也就是訪問系統中不存在的數據,導致請求在訪問緩存的時候發現不存在緩存,持續的去訪問數據庫。并且在訪問數據庫后,因該數據不存在導致無法構建緩存。若存在大量該請求時,數據庫壓力過大,可能會導致數據庫崩潰。

????????用一句話來說:用戶請求系統中不存在的數據,導致無法構建緩存,持續訪問數據庫,導致系統壓力過大。

可能產生的原因

????????一般情況下,在我們的系統中不應該存在這種可以訪問不存在的數據的方法。大概率是不好的用戶進行惡意請求。比如一個用戶了解到了系統中的一個API的訪問方法,那么用戶可以通過構建出來一個不存在的數據,然后去持續壓力訪問該API,就會導致緩存穿透問題的發生。

解決方案

????????明確一下我們需要解決的問題:我們要解決因為緩存穿透問題導致的數據庫壓力過大。那么換句話來說,我們只需要將這些無效數據盡可能的在訪問數據庫之前屏蔽掉就好了。

方案1:緩存空數據

????????如果我們發現一個API請求的數據在我們的數據庫和緩存中都不存在的話,我們可以通過將這個無效數據也緩存到Redis中,若惡意請求的key值都是一致的話,就會被我們攔截在緩存,防止數據庫壓力過大。

????????該方案也存在一些問題:

  • 如果惡意請求的數據是通過一個方式構造出來的,構造出來了大量的無效數據,那我們使用該方法可能會導致Redis中存取了大量的無效數據,這其實對Redis來說也不是很友好的。所以我們需要為這些緩存也要添加一個TTL過期時間,讓Redis將這些數據在一段時間之后進行過期。需要注意的是,這個位置如果我們的過期時間設置不合理的話,也可能會出現我們后文會出現到的問題:緩存雪崩問題。

方案2:布隆過濾器

????????布隆過濾器是一個比較好用的數據結構,通過布隆過濾器,我們可以快速判斷一個數據是否存在我們書庫中。

????????布隆過濾器簡單來說是由兩部分組成的:一個二進制向量(也可以說是個Bit Array二進制數組)和一系列的哈希函數。

????????布隆過濾器通過一個較大的bit數組用于保存所有數據,數字中每個數組只占1bit,并且每個元素的表示只能是0或1用于表示是否存在。當我們添加元素的時候,布隆過濾器通過一系列的哈希函數將數據進行計算,計算后的結果映射到數組中,將對應位置映射為1。當查詢元素的時候,通過哈希函數將元素映射,查看對應位置是否均為1,如果都為1的話則表示元素可能存在我們的數據中。

????????需要注意的是:如果我們查詢數據映射均為1的時候,我們只能說這個元素可能存在。因為存在多個元素映射到同樣的一系列位置的情況(哈希沖突)。所以我們不能一定確定數據存在。但是我們至少可以確定,如果映射的位置存在一位以上的0,那么可以說明這個數據一定不存在。


緩存擊穿問題

問題描述

????????緩存擊穿問題指的是:當我們處于一個高并發的情況下,存在一個熱點數據的訪問量非常大,在我們依然存在大量請求的同時這個熱點數據的緩存突然失效(可能是過期了或者被刪除),導致大量的并發請求同時穿透緩存,直接訪問數據庫,導致數據庫壓力過大,可能會導致系統崩潰。

????????用一句話來說:熱點數據過期,導致大量并發請求穿透緩存,直接訪問數據庫。

可能產生的原因

????????假設我們商城系統對某個商品的有秒殺活動,在秒殺商品活動結束的時候緩存過期,導致大量的后續請求直接訪問到數據庫中。

????????本質上就是熱點數據在高并發期間緩存過期。

解決方案

方案1:加互斥鎖

????????通過在緩存失效后,添加一個互斥鎖,保證只有一個請求去查詢數據庫,然后更新緩存,這樣就可以保證后續的請求可以正確的訪問緩存,不會直接訪問數據庫導致數據庫壓力過大。

方案2:提前預熱熱點數據

????????在發布前,我們應該對系統中存在的熱點數據應該有預知的。我們可以針對熱點數據進行提前預熱,將其存入緩存中并設置合適的過期時間。

方案3:設置熱點數據永不過期

????????該方案在選用的時候需要考慮實際情況,如果我們這個熱點數據是一致會被訪問,也就是說這個熱點數據一直都是熱點數據的話,我們可以考慮設置這個熱點數據永不過期。如果,熱點數據是有失效性的,那么這個方案并不很適用。


緩存雪崩問題

問題描述

????????緩存雪崩問題指的是:當我們存在系統中大部分緩存在同一時間失效,那么在緩存重建的過程中,如果存在大量的請求,這些請求會越過緩存直接對數據庫進行訪問,對數據庫造成巨大的壓力,可能會導致系統崩潰。當然,緩存服務器若突然宕機了,也會造成緩存雪崩問題。

可能產生的原因

  • 大量Key的TTL結束時間一致:我們設置緩存過期時間的時候可能設置的并不是很合理,導致大量的緩存在同一時間過期了,導致緩存雪崩問題。

  • 緩存服務器宕機:緩存服務都沒了,所有請求肯定都會直接對數據庫進行訪問,形成緩存雪崩問題。

解決方案

????????對于可能造成緩存雪崩的兩種原因,有下面不同的解決方案:

方案1:設置隨機失效時間

????????通過為每個需要添加隨機過期時間的Key添加隨機的失效時間偏移量,避免在同一時間內有大量數據過期。

????????該方案可以解決大量Key同一時間過期的情況,但是有效性也比較有限,如果存在大量數據同時添加緩存的話,該方案可能有些治標不治本。

方案2:采用多級緩存架構

????????通過構建多級緩存,不同層級設置不同的過期時間策略,保證同一時間內,存在可用的緩存。

方案3:部署集群

????????通過部署Redis集群,防止因為單個緩存宕機導致服務不可用。


總結

????????本篇對于緩存三劍客問題進行說明,在下篇文章將對各個問題以及對應的解決方案進行實踐。

【Redis】緩存三劍客問題實踐(下):(待發布)

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

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

相關文章

Flink 2.0 編譯

文章目錄 Flink 2.0 編譯第一個問題 java 版本太低maven 版本太低maven 版本太高開始編譯擴展多版本jdk 配置 Flink 2.0 編譯 看到Flink2.0 出來了,想去玩玩,看看怎么樣,當然第一件事,就是編譯代碼,但是沒想到這么多問…

獲取印度股票市場列表、查詢IPO信息以及通過WebSocket實時接收數據

為了對接印度股票市場,獲取市場列表、查詢IPO信息、查看漲跌排行榜以及通過WebSocket實時接收數據等步驟。 1. 獲取市場列表 首先,您需要獲取支持的市場列表,這有助于了解哪些市場可以交易或監控。 請求方法:GETURL&#xff1a…

云原生--CNCF-1-云原生計算基金會介紹(云原生生態的發展目標和未來)

1、CNCF定義與背景 云原生計算基金會(Cloud Native Computing Foundation,CNCF)是由Linux基金會于2015年12月發起成立的非營利組織,旨在推動云原生技術的標準化、開源生態建設和行業協作。其核心目標是通過開源項目和社區協作&am…

【Rust 精進之路之第5篇-數據基石·下】復合類型:元組 (Tuple) 與數組 (Array) 的定長世界

系列: Rust 精進之路:構建可靠、高效軟件的底層邏輯 作者: 碼覺客 發布日期: 2025-04-20 引言:從原子到分子——組合的力量 在上一篇【數據基石上】中,我們仔細研究了 Rust 的四種基本標量類型&#xff1…

MongoDB 集合名稱映射問題

項目場景 在使用 Spring Data MongoDB 進行開發時,定義了一個名為 CompetitionSignUpLog 的實體類,并創建了對應的 Repository 接口。需要明確該實體類在 MongoDB 中實際對應的集合名稱是 CompetitionSignUpLog 還是 competitionSignUpLog。 問題描述 …

物聯網 (IoT) 安全簡介

什么是物聯網安全? 物聯網安全是網絡安全的一個分支領域,專注于保護、監控和修復與物聯網(IoT)相關的威脅。物聯網是指由配備傳感器、軟件或其他技術的互聯設備組成的網絡,這些設備能夠通過互聯網收集、存儲和共享數據…

PCB原理圖解析(炸雞派為例)

晶振 這是外部晶振的原理圖。 32.768kHz 的晶振,常用于實時時鐘(RTC)電路,因為它的頻率恰好是一天的分數(32768 秒),便于實現秒計數。 C25 和 C24:兩個 12pF 的電容,用于…

Jupyter Notebook 中切換/使用 conda 虛擬環境的方式(解決jupyter notebook 環境默認在base下面的問題)

使用 nb_conda_kernels 添加所有環境 一鍵添加所有 conda 環境 conda activate my-conda-env # this is the environment for your project and code conda install ipykernel conda deactivateconda activate base # could be also some other environment conda in…

【JAVA】十三、基礎知識“接口”精細講解!(二)(新手友好版~)

哈嘍大家好呀qvq,這里是乎里陳,接口這一知識點博主分為三篇博客為大家進行講解,今天為大家講解第二篇java中實現多個接口,接口間的繼承,抽象類和接口的區別知識點,更適合新手寶寶們閱讀~更多內容持續更新中…

基于MuJoCo物理引擎的機器人學習仿真框架robosuite

Robosuite 基于 MuJoCo 物理引擎,能支持多種機器人模型,提供豐富多樣的任務場景,像基礎的抓取、推物,精細的開門、擰瓶蓋等操作。它可靈活配置多種傳感器,提供本體、視覺、力 / 觸覺等感知數據。因其對強化學習友好&am…

企業微信自建應用開發回調事件實現方案

目錄 1. 前言 2. 正文 2.1 技術方案 2.2 策略上下文 2.2 添加客戶策略實現類 2.3 修改客戶信息策略實現類 2.4 默認策略實現類 2.5 接收事件的實體類(可以根據事件格式的參數做修改) 2.6 實際接收回調結果的接口 近日在開發企業微信的自建應用時…

Linux將多個塊設備掛載到一個掛載點

在 Linux 系統中,直接將多個塊設備掛載到同一個掛載點是不可能的。這是因為 Linux 的文件系統掛載機制設計為一個掛載點一次只能關聯一個文件系統。如果嘗試將多個塊設備掛載到同一個掛載點,后一次掛載會覆蓋前一次的掛載,導致只有最后掛載的…

Spark-SQL(四)

本節課學習了spark連接hive數據,在 spark-shell 中,可以看到連接成功 將依賴放進pom.xml中 運行代碼 創建文件夾 spark-warehouse 為了使在 node01:50070 中查看到數據庫,需要添加如下代碼,就可以看到新創建的數據庫 spark-sql_1…

野外價值觀:在真實世界的語言模型互動中發現并分析價值觀

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

el-select+vue-virtual-scroller解決數據量大卡頓問題

解決el-select中數據量過大時,顯示及搜索卡頓問題,及正確的回顯默認選中數據 粗略的封裝了組件,有需要各種屬性自定義的,自己添加設置下 環境 node 16.20.1 npm 8.19.4 vue2、element-ui "vue-virtual-scroller"…

Sqlite3交叉編譯全過程

Sqlite3交叉編譯全過程 一、概述二、下載三、解壓四、配置五、編譯六、安裝七、驗證文件類型八、移植8.1、頭文件sqlite3.h8.2、動態鏈接庫移植8.3、靜態態鏈接庫移植 九、驗證使用9.1. 關鍵函數說明 十、觸發器使用十一、sqlite表清空且恢復id值十二、全文總結 一、概述 SQLi…

軟考軟件設計師考試情況與大綱概述

文章目錄 **一、考試科目與形式****二、考試大綱與核心知識點****科目1:計算機與軟件工程知識****科目2:軟件設計** **三、備考建議****四、參考資料** 這是一個系列文章的開篇 本文對2025年軟考軟件設計師考試的大綱及核心內容進行了整理,并…

【數學建模】孤立森林算法:異常檢測的高效利器

孤立森林算法:異常檢測的高效利器 文章目錄 孤立森林算法:異常檢測的高效利器1 引言2 孤立森林算法原理2.1 核心思想2.2 算法流程步驟一:構建孤立樹(iTree)步驟二:構建孤立森林(iForest)步驟三:計算異常分數 3 代碼實現…

【Android面試八股文】Android系統架構【一】

Android系統架構圖 1.1 安卓系統啟動 1.設備加電后執行第一段代碼:Bootloader 系統引導分三種模式:fastboot,recovery,normal: fastboot模式:用于工廠模式的刷機。在關機狀態下,按返回開機 鍵進…

jvm-獲取方法簽名的方法

在Java中,獲取方法簽名的方法可以通過以下幾種方式實現,具體取決于你的需求和使用場景。以下是詳細的介紹: 1. 使用反射 API Java 提供了 java.lang.reflect.Method 類來獲取方法的相關信息,包括方法簽名。 示例代碼&#xff1a…