快取穿透 快取擊穿和快取雪崩,了解一下

2022-06-12 21:03:10 字數 2336 閱讀 7729

目錄快取擊穿

快取雪崩

面試官: 什麼特馬的叫快取穿透,什麼特馬的叫快取擊穿,什麼特馬的叫快取雪崩?

我: 能不能好不問問題,不要特馬的, 特馬的!

一句話解釋: 當這條資料不存在於快取和資料庫中,然後會一直查詢資料庫,對資料庫造成很大的壓力。

如:使用者查詢乙個 id = -1 的商品資訊,一般資料庫 id 值都是從 1 開始自增,很明顯這條資訊是不在資料庫中,當沒有資訊返回時,會一直向資料庫查詢,給當前資料庫的造成很大的訪問壓力。

解決方案:

一般我們可以想到從快取開始出發,想如果我們給快取設定乙個如果當前資料庫不存在的資訊,把它快取成乙個空物件,返回給使用者。

沒錯,這是乙個解決方案,也就是我們常說的快取空物件(**維護簡單,但是效果不是很好)。

redis 也為我們提供了一種解決方案,那就是布隆過濾器(**維護比較複雜,效果挺好的)。

那接下來,先解釋下這兩種方案:

那什麼是快取空物件呀,別急,快取空物件它就是指乙個請求傳送過來,如果此時快取中和資料庫都不存在這個請求所要查詢的相關資訊,那麼資料庫就會返回乙個空物件,並將這個空物件和請求關聯起來存到快取中,當下次還是這個請求過來的時候,這時快取就會命中,就直接從快取中返回這個空物件,這樣可以減少訪問資料庫的壓力,提高當前資料庫的訪問效能。我們接下來可以看下面這個流程:

第一次請求----》 快取不存在 ------》 請求資料庫 -------》資料不存在 ------》 快取空物件

當n>2 時,

第n 次請求----》 快取存在 ------》 返回空物件

這時候,我們就會問了呀,如果大量不存在的請求過來,那麼這時候快取豈不是會快取許多空物件了嗎~~~

沒錯哦!這也是使用快取空物件會導致的乙個問題:如果時間一長這樣會導致快取中存在大量空物件,這樣不僅會占用許多的記憶體空間,還會浪費許多資源呀!。那這有沒有什麼可以解決的方法呢?我們來想一想:我們可以將這些物件在一段時間之後清理下不久可以了嗎 ~

嗯嗯,沒錯!在想想 redis 裡是不是給我們提供了有關過期時間的命令呀,這樣我們可以在設定空物件的時間,順便設定乙個過期時間,就可以解決個問題了呀

那布隆過濾器是不是不是乙個過濾器,過濾東西的呀!哎呀,你太聰明了,沒錯它就是用來過濾東西的,它是一種基於概率的資料結構,主要使用愛判斷當前某個元素是否在該集合中,執行速度快。我們也可以簡單理解為是乙個不怎麼精確的 set 結構(set 具有去重的效果)。但是有個小問題是:當你使用它的 contains 方法去判斷某個物件是否存在時,它可能會誤判。也就是說布隆過濾器不是特別不精確,但是只要引數設定的合理,它的精確度可以控制的相對足夠精確,只會有小小的誤判概率(這是可以接受的呀 ~)。當布隆過濾器說某個值存在時,這個值可能不存在;當它說不存在時,那就肯定不存在。

這裡有個典型的例子呀,來自錢大:

打個比方,當它說不認識你時,肯定就不認識;當它說見過你時,可能根本就沒見過面,不過因為你的臉跟它認識的人中某臉比較相似 (某些熟臉的係數組合),所以誤判以前見過你。在上面的使用場景中,布隆過濾器能準確過濾掉那些已經看過的內容,那些沒有看過的新內容,它也會過濾掉極小一部分 (誤判),但是絕大多數新內容它都能準確識別。這樣就可以完全保證推薦給使用者的內容都是無重複的。

說了這麼久,那布隆過濾器到底有什麼特點呢:

特點嗎每個布隆過濾器對應到 redis 的資料結構裡面就是乙個大型的位陣列和幾個不一樣的無偏 hash 函式。所謂無偏就是能夠把元素的 hash 值算得比較均勻。

一句話解釋:某一時刻,突然有關熱點key大併發訪問,導致快取擊穿

原因:

乙個冷門的key ,突然被大量的訪問。

乙個熱門的key, 快取中時間恰好過期,這時有大量使用者來進行訪問。

如果我們是在單機環境下:直接使用常用的鎖即可(如:lock、synchronized等),在分布式環境下我們可以使用分布式鎖,如:基於資料庫、基於redis或者zookeeper 的分布式鎖。

一句話解釋: 某一段時間段內,快取集中失效,如果有大併發請求,所有的請求到儲存層,引起資料庫壓力過大,導致宕機。

原因:

redis突然宕機

批量資料過期

redis 高可用

redis有可能掛掉,多增加幾台redis例項,(一主多從或者多主多從),這樣一台掛掉之後其他的還可以繼續工作,其實就是搭建的集群。

限流降級

在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量,對某個key只允許乙個執行緒查詢資料和寫快取,其他執行緒等待。

資料預熱

部署之前,將資料預先載入一遍

不同的過期時間

設定不同的過期時間,讓失效時間均衡

快取穿透 快取擊穿和快取雪崩,了解一下

目錄 快取擊穿 快取雪崩 面試官 什麼特馬的叫快取穿透,什麼特馬的叫快取擊穿,什麼特馬的叫快取雪崩?我 能不能好不問問題,不要特馬的,特馬的!一句話解釋 當這條資料不存在於快取和資料庫中,然後會一直查詢資料庫,對資料庫造成很大的壓力。如 使用者查詢乙個 id 1 的商品資訊,一般資料庫 id 值都是...

快取穿透,快取雪崩和快取擊穿

q 快取穿透,是指查詢乙個資料庫一定不存在的資料。正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。a 1.布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bitmap中,乙個...

快取擊穿 快取穿透和快取雪崩

快取擊穿 定義 快取中的key一般設有過期時間,如果某個key過期了,恰在這個時候,有大量的併發請求訪問這個key,則這些請求都會到達db,導致db瞬間壓力過大,壓垮db。解決方案 1.設定互斥鎖,mutex。當快取失效時不時立即去訪問資料庫,而是使用快取工具的操作成功帶返回值的操作,比如redis...