天天看點

【每日一題】緩存穿透、緩存擊穿、緩存雪崩及解決方案緩存穿透緩存擊穿緩存雪崩總結

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點選跳轉到網站。

當下ChatGPT很火,讓人心癢癢想試一試好不好用,是以我就試着借它寫一篇文章,但是試了幾次最終還是沒有生成想要的結果,基本上每次都是緩存擊穿寫了點之後也就沒了,也不知道是網絡問題還是怎麼了。不過本文最終還是由ChatGPT主導生成的文章,我隻是做個簡單的修飾。

【每日一題】緩存穿透、緩存擊穿、緩存雪崩及解決方案緩存穿透緩存擊穿緩存雪崩總結

好了,接下來言歸正傳。

緩存是許多現代Web應用程式的重要組成部分,因為它可以大大提高系統的性能和可靠性。然而,緩存也存在一些潛在的問題,如緩存穿透、緩存擊穿和緩存雪崩,這些問題可能導緻系統性能下降甚至當機。是以,對這些問題的了解和解決方案非常重要。面試也會經常問到緩存相關知識,緩存穿透、緩存擊穿、緩存雪崩基本也是必問的問題之一。但是我一個QPS不到10系統,問我這些問題,真的讓我很為難。。

【每日一題】緩存穿透、緩存擊穿、緩存雪崩及解決方案緩存穿透緩存擊穿緩存雪崩總結

緩存穿透

緩存穿透(Cache Penetration) 是指大量的無效請求直接到達後端資料庫,因為緩存中不存在該資料的緩存。這種情況下,大量的請求将直接影響到資料庫的性能,并可能導緻資料庫崩潰。

解決方案:

  1. 設定布隆過濾器(Bloom Filter) :使用布隆過濾器可以快速識别無效資料,進而避免直接請求資料庫。

    簡單介紹一下布隆過濾器:

    布隆過濾器(Bloom Filter) 是一種基于哈希的快速、高效的資料結構,可以用于判斷一個元素是否可能屬于某個集合,它可以在極小的空間開銷下,實作近似快速查詢,但存在一定的誤判率。

    布隆過濾器的核心思想是:如果一個元素不在集合中,那麼它對應的每一個位都不會被置為1,是以查詢時隻需要檢查這些位是否都為1即可确定該元素不在集合中。而如果一個元素在集合中,那麼它對應的位可能被其他元素所置為1,是以查詢時隻能判斷該元素可能在集合中,但不能确定其一定在集合中。

  2. 設定空值緩存:當請求的資料不存在時,可以将一個空值緩存到緩存中,避免重複請求資料庫。
  3. 黑名單機制:對于請求失敗次數進行記錄,超過一定次數後,将該資料加入黑名單,以後不再請求該資料。

緩存擊穿

緩存擊穿(Cache Breakdown) 是指在一個熱點資料的緩存過期時,大量的請求同時命中資料庫,導緻資料庫壓力過大。

解決方案:

  1. 加鎖:在緩存資料過期時可以使用鎖機制,避免多個請求同時命中資料庫。
  2. 緩存預熱:在緩存資料過期前,可以使用緩存預熱的方法将資料提前加載到緩存中,進而避免緩存資料過期時大量請求資料庫。
  3. 熱點資料不過期:熱點資料過期時間設定為不過期,背景定時去異步重新整理緩存。

緩存雪崩

緩存雪崩(Cache Avalanche) 是一種常見的緩存問題,發生在大量緩存資料同時過期時。當大量請求同時命中資料庫,資料庫壓力過大,導緻資料庫當機或性能嚴重下降。

解決方案:

  1. 緩存失效随機化:通過随機化緩存資料的失效時間,可以避免所有資料同時過期,進而避免緩存雪崩的問題。
  2. 動态調整緩存失效時間:通過動态調整緩存資料的失效時間,可以根據實際情況調整緩存資料的失效時間,進而避免緩存雪崩的問題。
  3. 緩存預熱:在緩存資料過期前,可以使用緩存預熱的方法将資料提前加載到緩存中,進而避免緩存資料過期時大量請求資料庫。
  4. 設定緩存容錯:在緩存系統中設定容錯機制,在緩存資料過期時可以使用備用資料源,進而避免資料庫當機。
  5. 緩存叢集:使用緩存叢集可以将緩存負載分散到多台機器上,進而避免緩存雪崩的問題

總結

最後對緩存穿透、緩存擊穿、緩存雪崩做一個總結:

緩存穿透 緩存擊穿 緩存雪崩
原因 大量的無效請求直接到達後端資料庫 一個熱點資料的緩存過期時,大量的請求同時命中資料庫 大量緩存資料同時過期時。當大量請求同時命中資料庫
解決方案 設定布隆過濾器、設定空值緩存、黑名單機制 加鎖、緩存預熱、熱點資料不過期 緩存失效随機化、動态調整緩存失效時間、緩存預熱、設定緩存容錯、緩存叢集