如何給女朋友解釋什麼是緩存穿透、緩存擊穿、緩存雪崩?

2021-01-10 Java技術架構

作者:漫話編程 來自:漫話編程

周末在家面試,和候選人聊到Redis的問題,於是問了他一個問題:你知道緩存穿透、緩存擊穿和緩存雪崩嗎?他們之間的區別是什麼?分別怎麼解決嗎?

面試結束後,女朋友好像有很多問號,於是來問我。

緩存穿透

要把這個問題講清楚,先舉個例子。

一個女孩子去門店買口紅,到了門店之後被告知她想要的那個色號已經沒有了。於是她要求店員去問總部還有沒有貨。總部發現這個色號也沒有了,於是女孩子就離開了。

過了一會另一個女孩子又來了,也想要購買同一個色號,店員就又總部問了一次。如此反覆。

女孩子買口紅不僅需要門店幫忙查詢,還需要總部也進行盤貨。類似這種情況,在緩存領域有一個類似的概念叫做緩存穿透。

緩存穿透是指緩存伺服器中沒有緩存數據,資料庫中也沒有符合條件的數據,導致業務系統每次都繞過緩存伺服器查詢下遊的資料庫,緩存伺服器完全失去了其應用的作用。

緩存空值

解決多次詢問總部的方法比較簡單,如果口紅門店在幫第一個女孩子查詢之後,就記錄下來這個色號已經沒有了,下次其他女孩再來問這個色號的時候,直接告訴她沒貨了。

這樣就可以避免每次都驚動總部了。

在緩存中,之所以會發生穿透,就是因為緩存沒有對那些不存在的值得Key緩存下來,從而導致每次查詢都要請求到資料庫。

那麼我們就可以為這些key對應的值設置為null並放到緩存中,這樣再出現查詢這個key 的請求的時候,直接返回null即可 。

但是還需要注意的就是需要有一個失效時間,因為如果不設置失效的話,如果哪天總部有貨了,門店還是當做沒貨的話,就會影響銷量了。

BloomFilter

很多時候,緩存穿透是因為有很多惡意流量的請求,這些請求可能隨機生成很多Key來請求查詢,這些肯定在緩存和資料庫中都沒有,那就很容易導致緩存穿透。

針對類似的情況,可以使用一個過濾器。

比如如果有一群人經常來門店問一些根本不存在的色號,比如五彩斑斕的黑,這些色號該品牌根本沒生產過的話,店員就可以直接告訴顧客不存在就行了,也不需要驚動總部。

在緩存穿透防治上常用的技術是布隆過濾器(Bloom Filter)。

布隆過濾器是一種比較巧妙的概率性數據結構,它可以告訴你數據一定不存在或可能存在,相比Map、Set、List等傳統數據結構它佔用內存少、結構更高效。

對於緩存穿透,我們可以將查詢的數據條件都哈希到一個足夠大的布隆過濾器中,用戶發送的請求會先被布隆過濾器攔截,一定不存在的數據就直接攔截返回了,從而避免下一步對資料庫的壓力。

緩存擊穿

有一種比較特殊的情況,那就是如果某一個熱門色號的口紅剛好賣完了,這時候有很多顧客同時來諮詢要購買這個色號,那麼門店內的多個售貨員可能分別給總部打電話諮詢是否有存貨。

或者如果有多家門店同時賣完了,那麼總部接收到的諮詢量就會劇增。類似這種情況,在緩存領域有一個類似的概念叫做緩存擊穿。

緩存擊穿是指當某一key的緩存過期時大並發量的請求同時訪問此key,瞬間擊穿緩存伺服器直接訪問資料庫,讓資料庫處於負載的情況。

異步定時更新

如果提前知道某一個色號比較暢銷的話,那就可以定時的諮詢總部是否還有存貨,定時的更新庫存情況就可以避免上面這種情況了。

在緩存處理上,同理,比如某一個熱點數據的過期時間是1小時,那麼每59分鐘,通過定時任務去更新這個熱點key,並重新設置其過期時間。

互斥鎖

還有一種解決辦法,那就是如果很多顧客諮詢的是同一個色號的口紅,那麼就先處理第一個用戶的諮詢,其他同樣請求的顧客先排隊等待。一直到店員從總部那裡獲取到最新的庫存信息後,就可以安排其他人繼續購買了。

在緩存處理上,通常使用一個互斥鎖來解決緩存擊穿的問題。簡單來說就是當Redis中根據key獲得的value值為空時,先鎖上,然後從資料庫加載,加載完畢,釋放鎖。若其他線程也在請求該key時,發現獲取鎖失敗,則先阻塞。

緩存雪崩

如果門店內的多個色號的口紅同時售罄了,並且門店在這個時間點剛好也不知道總部有沒有庫存了,這時候如果有大量顧客來到門店購物的話,就會有更多的諮詢電話打到總部那裡。

或者是門店突然出現問題了,不能提供服務了,很多顧客就可能自己打電話到總部諮詢庫存情況。類似這種情況,在緩存領域有一個類似的概念叫做緩存雪崩。

緩存雪崩是指當大量緩存同時過期或緩存服務宕機,所有請求的都直接訪問資料庫,造成資料庫高負載,影響性能,甚至資料庫宕機。

不同的過期時間

為了避免緩存雪崩,門店可以考慮給不同的色號的口紅預留不同的庫存,並且採用不同的頻率諮詢總部庫存情況,更新到門店中。這樣就可以避免突然同一個時間點所有色號都售罄。

為了避免大量的緩存在同一時間過期,可以把不同的key過期時間設置成不同的, 並且通過定時刷新的方式更新過期時間。

集群

為了避免門店出問題導致大量顧客直接打電話到總部,可以考慮開更多的門店,將用戶分流到多個店鋪中。

類似的,在緩存雪崩問題防治上面,一個比較典型的技術就是採用集群方式部署,使用集群可以避免服務單點故障。

相關焦點

  • 緩存雪崩緩存穿透緩存擊穿是什麼意思緩存潰之後會如何該如何應對
    緩存掛了,此時 1 秒 5000 個請求全部落資料庫,資料庫必然扛不住,它會報一下警,然後就掛了。此時,如果沒有採用什麼特別的方案來處理這個故障,DBA 很著急,重啟資料庫,但是資料庫立馬又被新的流量給打死了。這就是緩存雪崩。
  • 架構師視角|分布式緩存如何選擇?
    緩存系統的選擇圖1-1 1.1 緩存分類如上圖所示,首先緩存大致可以分為四大類。CDN 緩存:CDN 即內容分發網絡,CDN 邊緣節點將數據緩存起來。反向代理緩存:如 Nginx 的緩存。緩存常見問題以上介紹了簡單介紹了常見緩存系統,並具體列出了基於 Redis 的集群方案。下面談一談緩存系統常見的問題。如下圖所示,列出七個常見問題。4.1. 緩存穿透指訪問不存在的數據,從而繞過緩存,直接請求到了數據源,當請求過多,就會對 DB 造成壓力。
  • 沒人告訴過你更複雜的緩存穿透怎麼解決
    你應該從網上看過太多的文章說緩存穿透怎麼解決?無非就是布隆過濾器,緩存空值什麼的。但是,更深入的一個問題,緩存空值有沒有問題?如果緩存的空值太多怎麼辦?如果用的redis,那麼太多的空值會不會打爆你的redis?如果用的本地緩存,會不會打爆你的內存?繼而引發的問題就是還是會打爆你的資料庫。
  • 淘寶網緩存怎麼清理 淘寶網緩存清理方法
    淘寶系列軟體最新版本下載淘寶HD軟體版本:2.6.5Android軟體立即查看淘寶HD軟體版本:7.1.0iOS軟體立即查看網是一款非常不錯的購物軟體,小夥伴們通過淘寶網能夠買到既精品又實惠的商品來滿足大家的購物需求,那麼淘寶網裡面的緩存究竟應該怎麼清理呢
  • Redis緩存與NodeJS的初學教程
    雖然它最流行的用例是緩存,Redis還有很多其他用例,你可以利用它的快閃記憶體資料庫的快得驚人。在這個教程中,我們將給你一個快速介紹Redis。我們還將使用Redis為節點應用程式創建一個簡單的緩存,看看它是如何影響其性能的。
  • Mybatis緩存體系結構
    MyBatis 緩存結構由一級緩存和二級緩存構成,這兩級緩存均是使用 Cache 接口的實現類。因此,我將首先會向大家介紹 Cache 幾種實現類的源碼,然後再分析一級和二級緩存的實現。除了緩存之外,Mybatis也定義很多的裝飾器,同樣實現了Cache接口,通過這些裝飾器可以額外實現很多功能。這些緩存是怎麼分類的呢?所有的緩存可以大體歸為三類:基本類緩存、淘汰算法緩存、裝飾器緩存。
  • 微軟發布防範DNS緩存中毒漏洞的指南
    微軟發布防範DNS緩存中毒漏洞的指南 微軟發布了有關如何緩解DNS緩存中毒漏洞的指南,加利福尼亞大學和清華大學的安全研究人員報告了該漏洞。【51CTO.com快譯】微軟發布了有關如何緩解DNS緩存中毒漏洞的指南,加利福尼亞大學和清華大學的安全研究人員報告了該漏洞。
  • 高效刷新DNS緩存 解決網頁無法訪問
    連接網際網路的計算機會自動緩存網頁,以此提高重新打開頁面的訪問速度。如果IP 地址變更了,計算機緩存未及時更新,您可能無法打開網頁。遇到「未找到頁面」的錯誤,確定您已連接網際網路,可嘗試刷新 DNS 緩存,高效刷新DNS緩存 解決網頁無法訪問,有幾個辦法很好用。
  • 定位緩存偏差?消費者不該成待宰羔羊
    又到了年末,各大媒體平臺紛紛盤點年度熱詞,有一個詞姍姍來遲但卻相當「驚豔」,那就是:定位緩存偏差。近日,《我被美團會員割了韭菜》文章刷屏。而對於這位客戶的吐槽,12月17日,美團正式回應:文中提到的配送費差異與會員身份無關,是定位緩存偏差導致。定位緩存偏差,按照美團的解釋是因為軟體存在定位緩存,錯誤地使用了用戶上一次的歷史定位,與用戶實際位置產生了偏差,導致了配送費預估不準。而實際上,最終的配送費會按照真實配送地址計算,不會受到影響。
  • 課程設計指導——如何應用OSCache緩存框架提高Web頁面響應性能
    軟體項目實訓及課程設計指導——如何應用OSCache緩存框架提高Web頁面響應性能1、緩存應用技術是提高軟體應用系統性能的最簡單和最有效的方式之一在計算機的軟硬體系統中大量地應用緩存(Cache)技術,所謂「緩存」是指位於「目標」(可以為軟體類的應用系統,也可以為硬體設備或者部件
  • 「面經」高頻面試題:如何保證緩存與資料庫的雙寫一致性?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫分布式緩存是現在很多分布式應用中必不可少的組件,但是用到了分布式緩存,就可能會涉及到緩存與資料庫雙存儲雙寫,你只要是雙寫,就一定會有數據一致性的問題,那麼你如何解決一致性問題?
  • 瀏覽器緩存庫設計總結(localStorage/indexedDB)
    本文會介紹一些筆者曾經做過的Web性能優化方案以及瀏覽器緩存的基本流程,並會著重介紹如何利用瀏覽器緩存API封裝適合自己團隊的前端緩存庫來極大地提高應用性能,並為公司省錢.Cache-Control的max-age單位為秒,指定設置緩存最大的有效時間。當瀏覽器向伺服器發送請求後,在 max-age 這段時間裡瀏覽器就不會再向伺服器發送請求了。以上就是瀏覽器緩存幾個基本的概念,更多知識可以在wiki中學習,這裡就不一一介紹了.接下來我們具體看看如何優化web應用以及緩存策略給公司帶來的價值.
  • 前端——緩存驗證 Last-Modified 和 Etag 的使用
    如果我們設置了 Cache-Control 設置了 no-cache 之後;那麼每次瀏覽器對已經設置了 Cache-Control 的資源的請求的時候,都要去伺服器端進行一個資源的驗證,驗證完之後,如果確定這個資源可以使用緩存,他才會讀取本地的緩存。
  • 如何應用EhCache緩存框架提高J2EE Web應用系統持久層的響應性能
    軟體項目實訓及課程設計指導——如何應用EhCache緩存框架提高應用系統持久層響應性能1、在Web應用系統中應用持久層相關的緩存框架在Java應用程式開發實現和J2EE Web應用系統的設計和開發實現中,軟體應用系統的設計和開發實現人員可以在系統的表示層和系統的持久層中充分地應用緩存機制和相應實現技術能夠大大地提高
  • 沒想到Caffeine Cache才是Java本地高性能緩存的王者!
    Caffine Cache 在算法上的優點-W-TinyLFU說到優化,Caffine Cache到底優化了什麼呢?如前所述,作為現代的緩存,它需要解決兩個挑戰:一個是如何避免維護頻率信息的高開銷;另一個是如何反應隨時間變化的訪問模式。
  • 如何在Win10上清除Windows更新緩存,電腦高手教你3招
    通過清除Windows更新緩存不僅可以解決大多數Windows更新下載和安裝問題,還可以釋放大量磁碟空間。當你檢查Windows更新時,系統會自動緩存所有Windows更新安裝文件,這些文件在你需要重新應用更新時會派上用場。但有時錯誤的更新或緩存文件夾損壞會影響整個過程,這是由於Windows更新在下載過程中滯留數小時或由於不同錯誤而無法安裝造成的。
  • 網友自曝被美團割了韭菜,官方回應稱是定位緩存引發的偏差,當事人...
    在12月17日下午,美團與肖先生進行溝通之後,派出技術人員和客服到肖先生所在的小區進行「復現」,但這次卻沒能復現出肖先生的情況,美團給出的解釋是,他當時可能出現了「緩存位置偏差
  • 谷歌Chrome將解決性能問題 按網站對瀏覽器緩存進行分區
    12月28日 外媒 Bleeping Computer 報導,谷歌 Chrome 瀏覽器開發人員最近解決了一個安全問題,按網站對瀏覽器緩存進行分區,而不是單一的統一堆。
  • Google Chrome 改變緩存機制 阻止此前廣告商對其濫用
    這個Chrome瀏覽器組件被稱為HTTP緩存或共享緩存,它的工作原理是保存網頁上加載的資源副本,如圖片、CSS文件和JavaScript文件。其想法是,當用戶再次訪問同一網站或訪問使用相同文件的其他網站時,Chrome將從其內部緩存中加載這些文件,而不是浪費時間重新下載每個文件。
  • 愛優漫怎麼使用 愛優漫緩存漫畫方法流程
    愛優漫是一款非常不錯的漫畫閱讀平臺,小夥伴們通過愛優漫可以閱讀到各種優秀且十分精品的漫畫,同時小夥伴麼也可以將自己喜歡的漫畫進行緩存,那麼愛優漫裡面究竟應該怎麼緩存漫畫呢?下面小編就給大家介紹一下愛優漫緩存漫畫方法流程,希望能夠幫助到大家。