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