目錄快取擊穿
快取雪崩
面試官: 什麼特馬的叫快取穿透,什麼特馬的叫快取擊穿,什麼特馬的叫快取雪崩?我: 能不能好不問問題,不要特馬的, 特馬的!
一句話解釋: 當這條資料不存在於快取和資料庫中,然後會一直查詢資料庫,對資料庫造成很大的壓力。如:使用者查詢乙個 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...