緩存雪崩
-
什么是緩存雪崩
如果緩存集中在一段時間內失效,發生大量的緩存穿透,所有的查詢都落在數據庫上,造成了緩存雪崩。 由於原有緩存失效,新緩存未到期間所有原本應該訪問緩存的請求都去查詢數據庫了,而對數據 庫CPU和內存造成巨大壓力,嚴重的會造成數據庫宕機
-
你有什么解決方案來防止緩存雪崩?
加鎖排隊
首先多個請求同時緩存,如果有數據直接返回;沒有的話其中一個線程獲取鎖去訪問數據庫,查到數據,回設緩存,釋放鎖,然后其他請求直接取緩存里的數據
數據預熱
緩存預熱就是系統上線后,將相關的緩存數據直接加載到緩存系統。這樣就可以避免在 用戶請求的時候,先查詢數據庫,然后再將數據緩存的問題!用戶直接查詢事先被預熱的 緩存數據!可以通過緩存reload機制,預先去更新緩存,再即將發生大並發訪問前手動觸 發加載緩存不同的key
雙層緩存策略(很少使用)
C1為原始緩存,C2為拷貝緩存,C1失效時,可以訪問C2,C1緩存失效時間設置為短期,C2設置為長期。 定時更新緩存策略失效性要求不高的緩存,容器啟動初始化加載,采用定時任務更新或移除緩存 設置不同的過期時間,讓緩存失效的時間點盡量均勻
緩存穿透(擊穿)
-
什么是緩存穿透?
緩存穿透是指用戶查詢數據,在數據庫沒有,自然在緩存中也不會有。這樣就導致用戶查詢的時候,在緩存中找不到對應key的value,每次都要去數據庫再查詢一遍,然后返回空(相當於進行了兩次 無用 的查詢)。這樣請求就繞過緩存直接查數據庫
-
你有什么解決方案來防止緩存穿透?
采用布隆過濾器BloomFilter
將所有可能存在的數據哈 希到一個足夠大的 bitmap 中,一個一定不存在的數據會被這個 bitmap 攔截掉,從而避免了對底層存儲系統的查詢壓力
緩存空值
如果一個查詢返回的數據為空(不管是數據不存在,還是系統故障)我們仍然把這個空結果進行 緩存,但它的過期時間會很短,最長不超過五分鍾。通過這個直接設置的默認值存放到緩存, 這樣第二次到緩沖中獲取就有值了,而不會繼續訪問數據庫
-
什么是布隆過濾器?
本質上布隆過濾器是一種數據結構,比較巧妙的概率型數據結構(probabilistic data structure),特點是高效地插入和查詢,可以用來告訴你 “某樣東西一定不存在或者可能存在”。 相比於傳統的 List、Set、Map 等數據結構,它更高效、占用空間更少,但是缺點是其返回的結果是概率性的,而不是確切的。
-
布隆過濾器為什么不使用HashMap?
講述布隆過濾器的原理之前,我們先思考一下,通常你判斷某個元素是否存在用的是什么?應該蠻多人回答 HashMap 吧,確實可以將值映射到 HashMap 的 Key,然后可以在 O(1) 的時間復雜度內返回結果,效率奇高。但是 HashMap 的實現也有缺點,例如存儲容量占比高,考慮到負載因子的存在,通常空間是不能被用滿的,而一旦你的值很多例如上億的時候,那 HashMap 占據的內存大小就變得很可觀了。 還比如說你的數據集存儲在遠程服務器上,本地服務接受輸入,而數據集非常大不可能一次性讀進內存構建 HashMap 的時候,也會存在問題。
-
布隆過濾器原理?
布隆過濾器是一個 bit 向量或者說 bit 數組。
當我們要映射一個值到布隆過濾器時,先通過多個不同的哈希函數生成多個哈希值,並把對應哈希值的位置設為1。如下:
當我們再次映射一個值到布隆過濾器
此時5這個位置被映射了兩次,此時假設當我們查詢“阿豬”這個值是否存在,返回了4、5、6三個值,結果6這個位置沒有被映射過,所以可判定“一定不存在”;再假設我們查詢“阿雞”,返回了3、4、5三個值,此時也不可以判斷為存在,只能說明“可能存在”。