一、什麼是快取的穿透問題?
如圖,一個正常的請求一般都會經過cache層再到storage層。
而因為在storage中獲取不到資料,沒有把資料放在cache裡,導致了大量請求都達到了storage層,這就是快取穿透的一個定義。
快取的一個作用就是保護storage,也就是MySQL之類的資料庫,而快取穿透的話就失去了這一層保護
二、什麼原因導致了快取穿透?
- 業務程式碼自身問題:之前我遇到過有人寫的程式碼查出來是有資料的,但是存到cache的時候用了一個空的變數。這種是比較低階的,但是也是有這種情況
- 惡意攻擊、爬蟲等等:例如一個GET的介面,如果攻擊者一直在引數裡面傳一些不正常的值,就會導致大量的請求都無法cache到,就必然會導致快取穿透,資料量足夠大的情況下還會導致storage掛掉
三、如何發現快取穿透?
- 業務的響應時間:我們可以藉助ELK或其他監控系統,對業務的介面進行檢測。原本快取就是響應時間比較快的,如果經常超過閾值就一定會有所體現
- 業務本身問題
- 相關指標:總呼叫數、cache層命中數、storage層命中數
四、如何解決快取穿透問題?
- 快取空物件:如果storage中確實是null的話,我們也可以快取一個空物件,同時設定一個過期時間,比如說5分鐘、8分鐘,這個要看具體的使用場景。雖然說storage中確實是null,但是這樣可以為我們減緩storage的壓力,避免一些快取穿透的危害。
可能存在的問題:
- 需要更多的鍵:像我們前面提到的惡意攻擊,如果每次請求的key都不一樣,那就會將這些key都寫入cache,雖然只是一個null值,但如果資料量大的話還是會一些影響,所以我們一般都是使用過期時間來降低這樣的風險。
- cache層和storage層會有“短期”不一致:因為cache層設定了過期時間,如果storage層是某一個介面,cache層裡儲存了某個key為null之後,storage層裡新增了這個key的資料,就會導致短期時間內都只返回null。
- 布隆過濾器:將所有可能存在的key放在一個足夠大的bitmap中,則不存在的key會被這個bitmap攔截掉,從而避免了對底層儲存系統的查詢壓力,例如電話號碼等
更多好文
請掃描下面二維碼
歡迎關注~