快取穿透問題與解決方法

寫程式的趙童鞋發表於2018-10-10

一、什麼是快取的穿透問題?

快取穿透問題與解決方法

如圖,一個正常的請求一般都會經過cache層再到storage層。

而因為在storage中獲取不到資料,沒有把資料放在cache裡,導致了大量請求都達到了storage層,這就是快取穿透的一個定義。

快取的一個作用就是保護storage,也就是MySQL之類的資料庫,而快取穿透的話就失去了這一層保護

二、什麼原因導致了快取穿透?

  • 業務程式碼自身問題:之前我遇到過有人寫的程式碼查出來是有資料的,但是存到cache的時候用了一個空的變數。這種是比較低階的,但是也是有這種情況
  • 惡意攻擊、爬蟲等等:例如一個GET的介面,如果攻擊者一直在引數裡面傳一些不正常的值,就會導致大量的請求都無法cache到,就必然會導致快取穿透,資料量足夠大的情況下還會導致storage掛掉

三、如何發現快取穿透?

  • 業務的響應時間:我們可以藉助ELK或其他監控系統,對業務的介面進行檢測。原本快取就是響應時間比較快的,如果經常超過閾值就一定會有所體現
  • 業務本身問題
  • 相關指標:總呼叫數、cache層命中數、storage層命中數

四、如何解決快取穿透問題?

快取穿透問題與解決方法

  • 快取空物件:如果storage中確實是null的話,我們也可以快取一個空物件,同時設定一個過期時間,比如說5分鐘、8分鐘,這個要看具體的使用場景。雖然說storage中確實是null,但是這樣可以為我們減緩storage的壓力,避免一些快取穿透的危害。

可能存在的問題:

  1. 需要更多的鍵:像我們前面提到的惡意攻擊,如果每次請求的key都不一樣,那就會將這些key都寫入cache,雖然只是一個null值,但如果資料量大的話還是會一些影響,所以我們一般都是使用過期時間來降低這樣的風險。
  2. cache層和storage層會有“短期”不一致:因為cache層設定了過期時間,如果storage層是某一個介面,cache層裡儲存了某個key為null之後,storage層裡新增了這個key的資料,就會導致短期時間內都只返回null。
  • 布隆過濾器:將所有可能存在的key放在一個足夠大的bitmap中,則不存在的key會被這個bitmap攔截掉,從而避免了對底層儲存系統的查詢壓力,例如電話號碼等

更多好文

請掃描下面二維碼

歡迎關注~

快取穿透問題與解決方法

相關文章