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

緩存雪崩

  1. 什麼是緩存雪崩數據庫

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

    加鎖排隊緩存

    首先多個請求同時緩存,若是有數據直接返回;沒有的話其中一個線程獲取鎖去訪問數據庫,查到數據,回設緩存,釋放鎖,而後其餘請求直接取緩存裏的數據

    數據預熱服務器

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

    雙層緩存策略(不多使用)數據結構

    C1爲原始緩存,C2爲拷貝緩存,C1失效時,能夠訪問C2,C1緩存失效時間設置爲短時間,C2設置爲長期。 定時更新緩存策略失效性要求不高的緩存,容器啓動初始化加載,採用定時任務更新或移除緩存 設置不一樣的過時時間,讓緩存失效的時間點儘可能均勻

緩存穿透(擊穿)

  1. 什麼是緩存穿透?併發

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

    採用布隆過濾器BloomFilter線程

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

    緩存空值3d

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

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

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

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

    1573483280400

    當咱們要映射一個值到布隆過濾器時,先經過多個不一樣的哈希函數生成多個哈希值,並把對應哈希值的位置設爲1。以下:

    1573483190533

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

    1573483601669

    此時5這個位置被映射了兩次,此時假設當咱們查詢「阿豬」這個值是否存在,返回了四、五、6三個值,結果6這個位置沒有被映射過,因此可斷定「必定不存在」;再假設咱們查詢「阿雞」,返回了三、四、5三個值,此時也不能夠判斷爲存在,只能說明「可能存在」。

相關文章
相關標籤/搜索