面試題:緩存雪崩、穿透(擊穿)、布隆過濾器


緩存雪崩

  1. 什么是緩存雪崩

    如果緩存集中在一段時間內失效,發生大量的緩存穿透,所有的查詢都落在數據庫上,造成了緩存雪崩。 由於原有緩存失效,新緩存未到期間所有原本應該訪問緩存的請求都去查詢數據庫了,而對數據 庫CPU和內存造成巨大壓力,嚴重的會造成數據庫宕機
    
  2. 你有什么解決方案來防止緩存雪崩?

    加鎖排隊

    首先多個請求同時緩存,如果有數據直接返回;沒有的話其中一個線程獲取鎖去訪問數據庫,查到數據,回設緩存,釋放鎖,然后其他請求直接取緩存里的數據
    

    數據預熱

    緩存預熱就是系統上線后,將相關的緩存數據直接加載到緩存系統。這樣就可以避免在 用戶請求的時候,先查詢數據庫,然后再將數據緩存的問題!用戶直接查詢事先被預熱的 緩存數據!可以通過緩存reload機制,預先去更新緩存,再即將發生大並發訪問前手動觸 發加載緩存不同的key
    

    雙層緩存策略(很少使用)

    C1為原始緩存,C2為拷貝緩存,C1失效時,可以訪問C2,C1緩存失效時間設置為短期,C2設置為長期。 定時更新緩存策略失效性要求不高的緩存,容器啟動初始化加載,采用定時任務更新或移除緩存 設置不同的過期時間,讓緩存失效的時間點盡量均勻
    

緩存穿透(擊穿)

  1. 什么是緩存穿透?

    緩存穿透是指用戶查詢數據,在數據庫沒有,自然在緩存中也不會有。這樣就導致用戶查詢的時候,在緩存中找不到對應key的value,每次都要去數據庫再查詢一遍,然后返回空(相當於進行了兩次 無用 的查詢)。這樣請求就繞過緩存直接查數據庫
    
  2. 你有什么解決方案來防止緩存穿透?

    采用布隆過濾器BloomFilter

    將所有可能存在的數據哈 希到一個足夠大的 bitmap 中,一個一定不存在的數據會被這個 bitmap 攔截掉,從而避免了對底層存儲系統的查詢壓力
    

    緩存空值

    如果一個查詢返回的數據為空(不管是數據不存在,還是系統故障)我們仍然把這個空結果進行 緩存,但它的過期時間會很短,最長不超過五分鍾。通過這個直接設置的默認值存放到緩存, 這樣第二次到緩沖中獲取就有值了,而不會繼續訪問數據庫
    
  3. 什么是布隆過濾器?

    本質上布隆過濾器是一種數據結構,比較巧妙的概率型數據結構(probabilistic data structure),特點是高效地插入和查詢,可以用來告訴你 “某樣東西一定不存在或者可能存在”。
    
    相比於傳統的 List、Set、Map 等數據結構,它更高效、占用空間更少,但是缺點是其返回的結果是概率性的,而不是確切的。
    
  4. 布隆過濾器為什么不使用HashMap?

    講述布隆過濾器的原理之前,我們先思考一下,通常你判斷某個元素是否存在用的是什么?應該蠻多人回答 HashMap 吧,確實可以將值映射到 HashMap 的 Key,然后可以在 O(1) 的時間復雜度內返回結果,效率奇高。但是 HashMap 的實現也有缺點,例如存儲容量占比高,考慮到負載因子的存在,通常空間是不能被用滿的,而一旦你的值很多例如上億的時候,那 HashMap 占據的內存大小就變得很可觀了。
    
    還比如說你的數據集存儲在遠程服務器上,本地服務接受輸入,而數據集非常大不可能一次性讀進內存構建 HashMap 的時候,也會存在問題。
    
  5. 布隆過濾器原理?

    布隆過濾器是一個 bit 向量或者說 bit 數組。

    1573483280400

    當我們要映射一個值到布隆過濾器時,先通過多個不同的哈希函數生成多個哈希值,並把對應哈希值的位置設為1。如下:

    1573483190533

    當我們再次映射一個值到布隆過濾器

    1573483601669

    此時5這個位置被映射了兩次,此時假設當我們查詢“阿豬”這個值是否存在,返回了4、5、6三個值,結果6這個位置沒有被映射過,所以可判定“一定不存在”;再假設我們查詢“阿雞”,返回了3、4、5三個值,此時也不可以判斷為存在,只能說明“可能存在”。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM