天天看點

十分鐘徹底掌握緩存擊穿、緩存穿透、緩存雪崩緩存擊穿緩存穿透緩存雪崩總結

大家好,我是老三,刷題刷煩了……

寫篇文章緩一下,分享一下老八股:

緩存擊穿

緩存穿透

緩存雪崩

在了解這三大問題之前,我們要了解,常用的分布式緩存Redis單機并發量能達到萬級,常用的關系型資料庫MySQL一般并發量是千級,他們支援的并發量可能差十倍,是以要盡可能把流量攔截在緩存層。

為什麼呢?就像是大湖裡多排點水,就可能把小河道沖垮,不知道你聽過沒——長江之水天上來,白洋澱裡把不住。

緩存擊穿

什麼是緩存擊穿

先從緩存擊穿開始。

緩存擊穿: 一個并發通路量比較大的key在某個時間過期,導緻所有的請求直接打在DB上。

十分鐘徹底掌握緩存擊穿、緩存穿透、緩存雪崩緩存擊穿緩存穿透緩存雪崩總結

緩存擊穿會增大資料庫的負載,我們看看怎麼緩解。

緩存擊穿如何解決

加鎖更新

查詢緩存,發現緩存中不存在,加鎖,讓其它線程等待,隻讓一個線程去更新緩存。

十分鐘徹底掌握緩存擊穿、緩存穿透、緩存雪崩緩存擊穿緩存穿透緩存雪崩總結

異步更新

還有一個可行的方案是把緩存設定永不過期。那緩存怎麼更新呢?通過異步的方式去更新緩存。

比如背景設定一個守護線程定時更新緩存,但這種定時比較難以把握。

異步更新機制實際上更适合用于緩存預熱。

緩存穿透

什麼是緩存穿透

緩存穿透:緩存穿透指的查詢緩存和資料庫中都不存在的資料,這樣每次請求直接打到資料庫,就好像緩存不存在一樣。

十分鐘徹底掌握緩存擊穿、緩存穿透、緩存雪崩緩存擊穿緩存穿透緩存雪崩總結

緩存穿透将導緻不存在的資料每次請求都要到存儲層去查詢,失去了緩存保護後端存儲的意義。

緩存穿透可能會使後端存儲負載加大,如果發現大量存儲層空命中,可能就是出現了緩存穿透問題。

緩存穿透可能有兩種原因:

  1. 自身業務代碼問題
  2. 惡意攻擊,爬蟲造成空命中

我們來看看如何解決。

緩存穿透如何解決

緩存空值/預設值

一種方式是在資料庫不命中之後,把一個空對象或者預設值儲存到緩存,之後再通路這個資料,就會從緩存中擷取,這樣就保護了資料庫。

十分鐘徹底掌握緩存擊穿、緩存穿透、緩存雪崩緩存擊穿緩存穿透緩存雪崩總結

緩存空值有兩大問題:

  1. 空值做了緩存,意味着緩存層中存了更多的鍵,需要更多的記憶體空間(如果是攻擊,問題更嚴重),比較有效的

    方法是針對這類資料設定一個較短的過期時間,讓其自動剔除。

  2. 緩存層和存儲層的資料會有一段時間視窗的不一緻,可能會對業務有一定影響。

    例如過期時間設定為5分鐘,如果此時存儲層添加了這個資料,那此段時間就會出現緩存層和存儲層資料的不一緻。

    這時候可以利用消息隊列或者其它異步方式清理緩存中的空對象。

布隆過濾器

除了緩存空對象,我們還可以在存儲和緩存之前,加一個布隆過濾器,做一層過濾。

布隆過濾器裡會儲存資料是否存在,如果判斷資料不不能再,就不會通路存儲。

十分鐘徹底掌握緩存擊穿、緩存穿透、緩存雪崩緩存擊穿緩存穿透緩存雪崩總結

那布隆過濾器是什麼玩意兒?查找它會不會很慢?

布隆過濾器是什麼?

不知道你對哈希表了解多少,布隆過濾器是一個類似的東西。

它是一個連續的資料結構,每個存儲位存儲都是一個

bit

,即

或者

1

, 來辨別資料是否存在。

存儲資料的時時候,使用K個不同的哈希函數将這個變量映射為bit清單的的K個點,把它們置為1。

十分鐘徹底掌握緩存擊穿、緩存穿透、緩存雪崩緩存擊穿緩存穿透緩存雪崩總結

我們判斷緩存key是否存在,同樣,K個哈希函數,映射到bit清單上的K個點,判斷是不是1:

  • 如果全不是1,那麼key不存在;
  • 如果都是1,也隻是表示key可能存在。

至于為什麼?因為哈希函數是存在碰撞的可能的。

關于緩存穿透的兩種主要解決方案,我們簡單對比一下:

十分鐘徹底掌握緩存擊穿、緩存穿透、緩存雪崩緩存擊穿緩存穿透緩存雪崩總結

緩存雪崩

接下來我們看最嚴重的一種情況,緩存雪崩。

什麼是緩存雪崩

緩存雪崩: 當某⼀時刻發⽣⼤規模的緩存失效的情況,例如緩存服務當機、大量key在同一時間過期,這樣的後果就是⼤量的請求進來直接打到DB上,可能導緻整個系統的崩潰,稱為雪崩。

十分鐘徹底掌握緩存擊穿、緩存穿透、緩存雪崩緩存擊穿緩存穿透緩存雪崩總結

緩存雪崩如何解決

緩存雪崩是三大緩存問題裡最嚴重的一種,我們來看看怎麼預防和處理。

提高緩存可用性

  • 叢集部署:通過叢集來提升緩存的可用性,可以利用Redis本身的Redis Cluster或者第三方叢集方案如Codis等。
  • 多級緩存:設定多級緩存,第一級緩存失效的基礎上,通路二級緩存,每一級緩存的失效時間都不同。

過期時間

  • 均勻過期:為了避免大量的緩存在同一時間過期,可以把不同的 key 過期時間随機生成,避免過期時間太過集中。
  • 熱點資料永不過期。

熔斷降級

  • 服務熔斷:當緩存伺服器當機或逾時響應時,為了防止整個系統出現雪崩,暫時停止業務服務通路緩存系統。
  • 服務降級:當出現大量緩存失效,而且處在高并發高負荷的情況下,在業務系統内部暫時舍棄對一些非核心的接口和資料的請求,而直接傳回一個提前準備好的 fallback(退路)錯誤處理資訊。

總結

一張圖總結:

十分鐘徹底掌握緩存擊穿、緩存穿透、緩存雪崩緩存擊穿緩存穿透緩存雪崩總結