【面試普通人VS高手系列】說說緩存雪崩和緩存穿透的理解,以及如何避免?

来源:https://www.cnblogs.com/mic112/archive/2022/05/05/16225283.html
-Advertisement-
Play Games

聽說10個人去互聯網公司面試,有9個人會被問到緩存雪崩和緩存穿透的問題。 聽說,這9個人裡面,至少有8個人回答得不完整。 而這8個人裡面,全都是在網上找的各種面試資料去應付的,並沒有真正理解。 當然,也很正常,只有大規模應用緩存的架構才會重點關註這兩個問題。 那麼如何真正理解這兩個問題的底層邏輯,我 ...


聽說10個人去互聯網公司面試,有9個人會被問到緩存雪崩和緩存穿透的問題。

聽說,這9個人裡面,至少有8個人回答得不完整。

而這8個人裡面,全都是在網上找的各種面試資料去應付的,並沒有真正理解。

當然,也很正常,只有大規模應用緩存的架構才會重點關註這兩個問題。

那麼如何真正理解這兩個問題的底層邏輯,我們來看普通人和高手的回答。

普通人:

嗯.................

高手:

緩存雪崩,就是存儲在緩存裡面的大量數據,在同一個時刻全部過期,

原本緩存組件抗住的大部分流量全部請求到了資料庫。

導致資料庫壓力增加造成資料庫伺服器崩潰的現象。

image-20220328150446221

導致緩存雪崩的主要原因,我認為有兩個:

  1. 緩存中間件宕機,當然可以對緩存中間件做高可用集群來避免。
  2. 緩存中大部分key都設置了相同的過期時間,導致同一時刻這些key都過期了。對於這樣的情況,可以在失效時間上增加一個1到5分鐘的隨機值。

緩存穿透問題,表示是短時間內有大量的不存在的key請求到應用裡面,而這些不存在的key在緩存裡面又找不到,從而全部穿透到了資料庫,造成資料庫壓力。

我認為這個場景的核心問題是針對緩存的一種攻擊行為,因為在正常的業務裡面,即便是出現了這樣的情況,由於緩存的不斷預熱,影響不會很大。

而攻擊行為就需要具備時間是的持續性,而只有key確實在資料庫裡面也不存在的情況下,才能達到這個目的,所以,我認為有兩個方法可以解決:

  1. 把無效的key也保存到Redis裡面,並且設置一個特殊的值,比如“null”,這樣的話下次再來訪問,就不會去查資料庫了。

  2. 但是如果攻擊者不斷用隨機的不存在的key來訪問,也還是會存在問題,所以可以用布隆過濾器來實現,在系統啟動的時候把目標數據全部緩存到布隆過濾器裡面,當攻擊者用不存在的key來請求的時候,先到布隆過濾器裡面查詢,如果不存在,那意味著這個key在資料庫裡面也不存在。

    布隆過濾器還有一個好處,就是它採用了bitmap來進行數據存儲,占用的記憶體空間很少。

image-20220328160151160

不過,在我看來,您提出來的這個問題,有點過於放大了它帶來的影響。

首先,在一個成熟的系統裡面,對於比較重要的熱點數據,必然會有一個專門緩存系統來維護,同時它的過期時間的維護必然和其他業務的key會有一定的差別。而且非常重要的場景,我們還會設計多級緩存系統。

其次,即便是觸發了緩存雪崩,資料庫本身的容災能力也並沒有那麼脆弱,資料庫的主從、雙主、讀寫分離這些策略都能夠很好的緩解併發流量。

最後,資料庫本身也有最大連接數的限制,超過限制的請求會被拒絕,再結合熔斷機制,也能夠很好的保護資料庫系統,最多就是造成部分用戶體驗不好。

另外,在程式設計上,為了避免緩存未命中導致大量請求穿透到資料庫的問題,還可以在訪問資料庫這個環節加鎖。雖然影響了性能,但是對系統是安全的。

image-20220328154257800

總而言之,我認為解決的辦法很多,具體選擇哪種方式,還是看具體的業務場景。

以上就是我對這個問題的理解。

總結

我發現現在很多面試,真的是為了面試而面試,要麼就是在網上摘題,要麼就是不斷的問一些無關痛癢的問題。

至於最終面試官怎麼判斷你是否合適,咱也不知道,估計就是有些小伙伴說的,看長相,看眼緣!

我認為一個合格的面試官,他必須要具備非常深厚的技術功底。

本期的普通人VS高手面試系列就到這裡結束了,喜歡的朋友記得點贊和收藏。

另外,有任何技術上的問題,職業發展有關的問題,都可以私信我,我會在第一時間回覆。

file

版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關註和贊,您的堅持是我不斷創作的動力。歡迎關註「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天是對vue組件化的一個理解,最主要的單文件組件,然後就可以腳手架的學習了,本來昨晚就該上傳的,但是用的那個上傳博客園的Python腳本不行了,換了一個新的。 組件化讓我越來越感覺到框架的力量了 一.模塊與組件,模塊化與組件化 1.對組件的理解 如果以我們原來編寫一個網頁的方式 依賴關係混亂我就不 ...
  • 1.基本介紹 1.1.概念 高層模塊不能依賴於一個“具體化、細節化”的低層模塊,而是通過一個抽象的“規範/標準”建立兩者之間的依賴關係,簡言之就是:不依賴於實現,而是依賴於抽象。這裡“實現”一詞有的地方也稱為“細節”,在編碼中主要體現的是我們根據業務模型具體自定義的普通類,比如:員工類、商品類等。而 ...
  • 分享一下 Idea 的 scope 功能 事情的起因是我在使用 idea 的call hierarchy功能時,覺得它沒有像find usage那樣有排除功能,並且如果點擊了展開全部,當代碼中使用了某些框架導致調用層級非常深時,idea 會占用非常高的 CPU。 於是我去 jetbrains 的缺陷 ...
  • Spring自動註入 spring的ioc 在剛開始學習spring的時候肯定都知道spring的兩個特點:ioc,aop,控制反轉和切麵編程,這篇就只說說ioc ioc是什麼:在我們原來的代碼中,如果A依賴了B,那麼我們會自己在A類中來new B,創建B的實例來使用,是程式主動的去創建依賴,但是我 ...
  • 前言 隨著python越來越火爆併在2021年10月,語言流行指數的編譯器Tiobe將Python加冕為最受歡迎的編程語言,且置於Java、C和JavaScript之上,越來越多的人瞭解python. 但是,很多人都會疑惑: 它憑什麼這麼火爆呢?學了它能幹什麼?它真的有這麼厲害嗎? 在這些問題中,我 ...
  • JList、JComboBox實現列表框 無論從哪個角度來看, JList 和 JComboBox 都是極其相似的,它們都有一個列表框,只是 JComboBox的列表框需要 以下拉方式顯示出來; JList 和 JComboBox 都可以通過調用 setRendererO方法來改變列表項的表現形式 ...
  • 強類型語言 要求變數的使用嚴格符合規定,所有變數都必須先定義後才能使用 弱類型語言 Java 的數控類型分為兩大類 基本類型(primitive type) 引用類型(reference type) 什麼是位元組 位(bit):是電腦 內部儲存的最小單位,11001100是一個八位二進位數。 位元組( ...
  • 淺嘗Spring註解開發_Spring容器創建概述 淺嘗Spring註解開發,基於Spring 4.3.12 概述Spring容器創建的過程,包括12個方法的執行 淺嘗Spring註解開發_自定義註冊組件、屬性賦值、自動裝配 淺嘗Spring註解開發_Bean生命周期及執行過程 淺嘗Spring註解 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...