當儲存系統成為瓶頸時,比如高併發、讀多寫少等場景,我們首先會想到的就是利用快取來提高整個系統的效能。
快取雖然能夠大大提升整個系統的效能,但同時也引入了更多複雜性。
如果沒有針對快取進行比較好的處理,某些場景下甚至會導致整個系統崩潰。
這次我們要聊的就是:快取穿透。
快取穿透
快取穿透是指在查詢快取資料時,快取中沒有對應資料,還需要去儲存系統中查詢資料。
一般有以下兩種情況:
對應資料根本不存在
如果儲存系統中沒有某個資料,一般不會在快取中儲存相應的資料。
這樣就導致在查詢快取資料的時候,在快取中找不到對應的資料,每次都要去儲存系統中再查詢一遍,然後返回資料不存在。
在這個場景中,快取並沒有起到分擔儲存系統訪問壓力的作用。
讀取不存在的資料的請求量一般不會太大,但如果出現一些惡意攻擊,故意大量訪問某些不存在的資料,就會對儲存系統造成很多壓力。
解決辦法
-
如果查詢儲存系統的資料沒有找到,則直接設定一個特定值存到快取中。之後讀取快取時就會獲取到這個特定值,直接返回空值,就不會繼續訪問儲存系統了。
-
把已存在資料的key存放在布隆過濾器中。當有新的請求時,先到布隆過濾器中查詢是否存在,如果不存在該條資料直接返回;如果存在該條資料再查詢快取查詢儲存系統。
快取資料時生成耗時較長
儲存系統中存在對應的資料,但生成快取資料需要耗費較長時間或者大量資源。
如果剛好在訪問的時候對應的快取失效了,那麼快取不會發揮作用,訪問壓力全部都集中在儲存系統上。
比如某寶上的分類商品列表,因為資料量巨大,並且還有按銷量、信用、價格等各種排序,不可能把所有資料都快取起來,所以只能按照分頁的頁數進行快取。
如果每次點選分頁的時候按分頁計算並生成快取資料,一般情況下是沒問題的,因為真正的使用者不會從第一頁一直翻到最後一頁。
真正的使用者訪問一般都集中在前十頁,所以第十頁以後的快取過期失效的可能性很大。
那麼問題就來了,假如被競爭對手用爬蟲來遍歷所有分頁的時候,此時很多分頁快取可能都失效了,從儲存系統中生成快取資料又非常耗費時間,所以爬蟲會將整個儲存系統全部拖慢,整個系統效能就可能出現問題。
解決辦法
-
限制分頁的數量,比如某寶上分類商品列表,最大分頁就到100頁。當然,從產品角度看,這樣的做法不是很好,因為100頁以後的商品將永遠不會被使用者看到。
-
後臺作業定時更新快取,而不是在訪問頁面時生成快取資料。這樣可以按照一定策略定時更新快取,不會對儲存系統較大的瞬時壓力。
總結
快取穿透是指在查詢快取資料時,快取中沒有對應資料,還需要去儲存系統中查詢資料。
通常情況下有兩種情況:對應資料根本不存在、快取資料時生成耗時較長。
微信公眾號:萬貓學社
微信掃描二維碼
關注後回覆「電子書」
獲取12本Java必讀技術書籍
最後,感謝你的點贊和關注,帥氣又美麗。