快取穿透詳解及解決方案

萬貓學社發表於2022-02-17

當儲存系統成為瓶頸時,比如高併發、讀多寫少等場景,我們首先會想到的就是利用快取來提高整個系統的效能。

快取雖然能夠大大提升整個系統的效能,但同時也引入了更多複雜性。

如果沒有針對快取進行比較好的處理,某些場景下甚至會導致整個系統崩潰。

這次我們要聊的就是:快取穿透。

快取穿透

快取穿透是指在查詢快取資料時,快取中沒有對應資料,還需要去儲存系統中查詢資料。

一般有以下兩種情況:

對應資料根本不存在

如果儲存系統中沒有某個資料,一般不會在快取中儲存相應的資料。

這樣就導致在查詢快取資料的時候,在快取中找不到對應的資料,每次都要去儲存系統中再查詢一遍,然後返回資料不存在。

在這個場景中,快取並沒有起到分擔儲存系統訪問壓力的作用。

讀取不存在的資料的請求量一般不會太大,但如果出現一些惡意攻擊,故意大量訪問某些不存在的資料,就會對儲存系統造成很多壓力。

解決辦法

  1. 如果查詢儲存系統的資料沒有找到,則直接設定一個特定值存到快取中。之後讀取快取時就會獲取到這個特定值,直接返回空值,就不會繼續訪問儲存系統了。

  2. 把已存在資料的key存放在布隆過濾器中。當有新的請求時,先到布隆過濾器中查詢是否存在,如果不存在該條資料直接返回;如果存在該條資料再查詢快取查詢儲存系統。

快取資料時生成耗時較長

儲存系統中存在對應的資料,但生成快取資料需要耗費較長時間或者大量資源。

如果剛好在訪問的時候對應的快取失效了,那麼快取不會發揮作用,訪問壓力全部都集中在儲存系統上。

比如某寶上的分類商品列表,因為資料量巨大,並且還有按銷量、信用、價格等各種排序,不可能把所有資料都快取起來,所以只能按照分頁的頁數進行快取。

如果每次點選分頁的時候按分頁計算並生成快取資料,一般情況下是沒問題的,因為真正的使用者不會從第一頁一直翻到最後一頁。

真正的使用者訪問一般都集中在前十頁,所以第十頁以後的快取過期失效的可能性很大。

那麼問題就來了,假如被競爭對手用爬蟲來遍歷所有分頁的時候,此時很多分頁快取可能都失效了,從儲存系統中生成快取資料又非常耗費時間,所以爬蟲會將整個儲存系統全部拖慢,整個系統效能就可能出現問題。

解決辦法

  1. 限制分頁的數量,比如某寶上分類商品列表,最大分頁就到100頁。當然,從產品角度看,這樣的做法不是很好,因為100頁以後的商品將永遠不會被使用者看到。

  2. 後臺作業定時更新快取,而不是在訪問頁面時生成快取資料。這樣可以按照一定策略定時更新快取,不會對儲存系統較大的瞬時壓力。

總結

快取穿透是指在查詢快取資料時,快取中沒有對應資料,還需要去儲存系統中查詢資料。

通常情況下有兩種情況:對應資料根本不存在、快取資料時生成耗時較長。

微信公眾號:萬貓學社

微信掃描二維碼

關注後回覆「電子書」

獲取12本Java必讀技術書籍

快取穿透詳解及解決方案

最後,感謝你的點贊關注,帥氣又美麗。

相關文章