搜尋
首頁Javajava教程Java MQ訊息佇列的基礎知識點有哪些?

快取雪崩

我們先看這個正常的快取流程是怎麼樣的?如下圖所示:

java mq消息队列的知识点有哪些

可以看到,首先這個用戶訪問這個某東,然後這個某東去訪問這個Redis,如果Redis 有該訪問數據,就會直接回傳查緩存拿到的數據;如果Redis 快取沒有查到該數據,就會去MySql 資料庫中查詢,查詢到有結果把從MySql 中查到的數據同步至Redis 快取中去,同時會把這個查詢到的結果回回去。

這是一個簡單的正常的快取流程。那我們基於這個正常的快取流程,來看下什麼是快取的雪崩。

首先給大家舉個例子,就是在雙十一的時候,在某東買東西,進入它的這個首頁,由於是雙十一,首頁的訪問量是非常大的,所以首頁的很多資料都是緩存在redis 裡面的。

假設首頁資料儲存在redis 裡的100 個key,設定的快取失效時間是兩個小時,當在雙十一期間,購物超過兩個小時之後,這個首頁資料的redis 快取在這瞬間會全部失效,導致所有的請求都打到這個MySql 資料庫上,此時資料庫的存取壓力增大,造成這個MySql 資料庫回應不及時而掛掉,從而某東的首頁就沒辦法繼續對外提供服務了,然後東哥就特別不開心,把這次的技術負責人送去了非洲。

那麼透過這個舉例,我們來看下面這個圖:

java mq消息队列的知识点有哪些

#就是說使用者造訪某東,這個時候redis 裡面的key 大量失效,導致這個某東直接存取資料庫,把大量的請求都打到來資料庫,這種現象就是快取雪崩。簡單來說就是 redis 快取在同一時間大量失效,就像這個雪崩來了一樣。

那麼快取雪崩它的解決方案有幾種呢?下面來說:

  • 設定這個快取的失效時間,不讓大量的key 在同一時間失效,也就是在設定這個快取的時候,可以將key 的失效時間分散開

  • 我們部署redis 一般是叢集部署的,可以把這些熱點的key 放到不同的節點上去,讓這些熱點的key 均勻的分佈在不同的redis 節點上

  • 還有就是比較暴力的方法,不設定這個快取失效的時間,讓 key 永遠不會失效

快取穿透

接下來我們再來介紹什麼是快取穿透。

還是舉個例子:比如說某位老哥開發了一個網站,然後這個網站非常的受歡迎,某一天突然遭到了黑客瘋狂的攻擊,他的這個攻擊手段就是採用這個緩存穿透的原理。

大家都知道通常情況下,資料庫的主鍵是從0開始遞增的,是沒有負數的,那麼這位駭客就利用這點,他不斷的用 ID 小於零的參數發請求過來。這位老哥剛開始是把網站的所有資料放到了redis 快取裡面去,但是駭客是用ID 小於零的數來請求,redis 快取裡面並沒有這個ID 小於零的數據,這樣redis 就查不到這個結果,一旦redis 查不到結果就會去資料庫中查,那麼所有請求都會打到資料庫,而且會一直打到資料庫中去,因為redis 快取這層根本攔截不到這樣的資料。

redis 快取直接被這種資料穿透了,直接穿透到資料庫裡面。同樣我們來看下面這個圖:

java mq消息队列的知识点有哪些

首先這個惡意使用者存取某東,用id=-1 的資料去請求,然後這個id=-1 的資料在redis 快取裡面沒有查到,就到資料庫裡面查詢,也沒有查到該條數據,只能回傳空數據給前端了。

這個惡意使用者(駭客)用腳本不斷的發這個資料去請求,直接穿透 redis 打到這個資料庫上,這就是所謂的快取穿透。簡單來說,快取穿透就是指快取和資料庫中都沒有這樣的數據,一般出現這種情況都不是正常的使用者在存取。

那麼快取穿透的解決方案有以下幾點:

  • #請求如果穿透redis,直接到資料庫,那麼資料庫無論查出什麼結果,都寫回redis 快取裡面去,這樣下次用同一個參數發來請求的時候,就直接被redis 快取攔截掉了,就不回打到資料庫了

  • 對請求的參數做合法性校驗

  • 比較直接、簡單粗暴的方法,把這個 IP 拉黑

  • 最後是使用布隆過濾器,這是一個非常好的方式

快取擊穿

我們再來講最後一個問題,就是快取的擊穿。

還是拿雙十一來舉例:東哥在雙十一的時候,發話說想搞一個大活動,說想把自己20年前用的電腦拿出來拍賣,然後有巨多人對這台電腦有興趣,於是東哥決定在雙十一當天九點拍賣這台電腦,然後某東的開發程式設計師,把這台電腦資料放到了redis 快取裡,也就是對應redis 快取裡的一個key。

拍賣的時候,大家熱情都非常的高漲,持續拍賣了將近三個小時,還沒有結束這場線上拍賣,但是這台電腦對應的redis 緩存key 的失效時間是三個半小時。當大家拍賣到三個半小時的時候,這台電腦的緩存key 突然失效了,導致這個大量的拍賣請求在redis 裡面查不到數據,從而這些大量請求就會直接打到數據庫上,此時數據庫的瞬間壓力增大,造成反應不及時而掛掉。
這時候呢,東哥看到自己的這台電腦還沒拍賣出去,有點生氣,於是把這個程式設計師送去了非洲。

同樣我們也來看下面這個圖:

java mq消息队列的知识点有哪些

用戶訪問某東,然後去redis 請求某個拍賣秒殺商品,在快取沒有失效的時候,redis 可以把這個查詢到的快取key 的結果回回去,但是當這個快取的key 失效了,這個請求就會擊穿這個redis,直接打到資料庫上。

這裡大家注意的是,這裡是某一個熱點的key,大量的用戶請求不斷的訪問這個熱點的key,當這個熱點的key 突然失效,把請求都打到資料庫上,這個過程就是叫做快取擊穿了。 記住它是擊穿某個一個非常熱點的 key

那麼這個快取擊穿的解決方案是:

  • 讓這個熱點key 不過期,即不設定失效時間(不建議)

  • 使用分散式鎖定,如果是單體應用的話使用互斥鎖(分散式鎖定後續文章會講)

#

以上是Java MQ訊息佇列的基礎知識點有哪些?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
JVM如何促進Java的'寫作一次,在任何地方運行”(WORA)功能?JVM如何促進Java的'寫作一次,在任何地方運行”(WORA)功能?May 02, 2025 am 12:25 AM

JVM通過字節碼解釋、平台無關的API和動態類加載實現Java的WORA特性:1.字節碼被解釋為機器碼,確保跨平台運行;2.標準API抽像操作系統差異;3.類在運行時動態加載,保證一致性。

Java的較新版本如何解決平台特定問題?Java的較新版本如何解決平台特定問題?May 02, 2025 am 12:18 AM

Java的最新版本通過JVM優化、標準庫改進和第三方庫支持有效解決平台特定問題。 1)JVM優化,如Java11的ZGC提升了垃圾回收性能。 2)標準庫改進,如Java9的模塊系統減少平台相關問題。 3)第三方庫提供平台優化版本,如OpenCV。

說明JVM執行的字節碼驗證的過程。說明JVM執行的字節碼驗證的過程。May 02, 2025 am 12:18 AM

JVM的字節碼驗證過程包括四個關鍵步驟:1)檢查類文件格式是否符合規範,2)驗證字節碼指令的有效性和正確性,3)進行數據流分析確保類型安全,4)平衡驗證的徹底性與性能。通過這些步驟,JVM確保只有安全、正確的字節碼被執行,從而保護程序的完整性和安全性。

平台獨立性如何簡化Java應用程序的部署?平台獨立性如何簡化Java應用程序的部署?May 02, 2025 am 12:15 AM

Java'splatFormIndepentEncealLowsApplicationStorunonAnyOperatingsystemwithajvm.1)singleCodeBase:writeandeandcompileonceforallplatforms.2)easileupdates:updatebybytecodeforsimultanane deployment.3)testOnOneOnePlatForforurouniverSalpeforuluniverSalpehavior formafforulululyiversalivernave.444.44.444

Java的平台獨立性如何隨著時間的流逝而發展?Java的平台獨立性如何隨著時間的流逝而發展?May 02, 2025 am 12:12 AM

Java的平台獨立性通過JVM、JIT編譯、標準化、泛型、lambda表達式和ProjectPanama等技術不斷增強。自1990年代以來,Java從基本的JVM演進到高性能的現代JVM,確保了代碼在不同平台的一致性和高效性。

在Java應用程序中緩解平台特定問題的策略是什麼?在Java應用程序中緩解平台特定問題的策略是什麼?May 01, 2025 am 12:20 AM

Java如何緩解平台特定的問題? Java通過JVM和標準庫來實現平台無關性。 1)使用字節碼和JVM抽像操作系統差異;2)標準庫提供跨平台API,如Paths類處理文件路徑,Charset類處理字符編碼;3)實際項目中使用配置文件和多平台測試來優化和調試。

Java的平台獨立性與微服務體系結構之間有什麼關係?Java的平台獨立性與微服務體系結構之間有什麼關係?May 01, 2025 am 12:16 AM

java'splatformentenceenhancesenhancesmicroservicesharchitecture byferingDeploymentFlexible,一致性,可伸縮性和便攜性。 1)DeploymentFlexibilityAllowsibilityAllowsOllowsOllowSorlowsOllowsOllowsOllowSeStorunonAnyPlatformwithajvM.2)penterencyCrossServAccAcrossServAcrossServiCessImplifififiesDeevelopmentandeDe

GRAALVM與Java的平台獨立目標有何關係?GRAALVM與Java的平台獨立目標有何關係?May 01, 2025 am 12:14 AM

GraalVM通過三種方式增強了Java的平台獨立性:1.跨語言互操作,允許Java與其他語言無縫互操作;2.獨立的運行時環境,通過GraalVMNativeImage將Java程序編譯成本地可執行文件;3.性能優化,Graal編譯器生成高效的機器碼,提升Java程序的性能和一致性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境