老徐和阿珍的故事:快取穿透、快取擊穿、快取雪崩、快取熱點,傻傻分不清楚

萬貓學社發表於2022-03-28

人物背景

老徐,男,本名徐福貴,從事Java相關研發工作多年,職場老油條,摸魚小能手,雖然歲數不大但長的比較著急,人稱老徐。據說之前炒某幣敗光了所有家產,甚至現在還有欠債。

阿珍,女,本名陳家珍,剛剛入職不久的實習生,雖然是職場菜鳥但聰明好學。據說是學校的四大校花之一,追求她的人從旺角排到了銅鑼灣,不過至今還單身。

微信掃描二維碼關注後回覆「電子書」,獲取12本Java必讀技術書籍。
老徐和阿珍的故事:快取穿透、快取擊穿、快取雪崩、快取熱點,傻傻分不清楚

阿珍:“在高併發下遇到瓶頸的時候,經常會用到快取來提高整個系統的效能。”

老徐:“嗯,不過快取能夠大大提升整個系統的效能,但同時也引入了更多複雜性。”

阿珍點了點頭,說:“是啊,快取穿透、快取擊穿、快取雪崩、快取熱點這些東西,這些東西我一直分不清楚,經常混淆。”

老徐立刻自信滿滿地說:“這個我懂啊,你聽我給你娓娓道來。”

快取穿透

快取穿透是指在查詢快取資料時,快取和資料庫中都沒有對應資料,在快取中找不到對應的資料,每次都要去資料庫中再查詢一遍,然後返回資料不存在。

在這個場景中,快取並沒有起到分擔資料庫訪問壓力的作用。讀取不存在的資料的請求量一般不會太大,但如果出現一些惡意攻擊,故意大量訪問某些不存在的資料,就會對資料庫造成很多壓力。

阿珍:“太可怕了,萬一遇到了這樣攻擊,該怎麼辦呀?”

老徐:“這個很好應對的,一般有兩種辦法。”

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

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

微信掃描二維碼關注後回覆「電子書」,獲取12本Java必讀技術書籍。
老徐和阿珍的故事:快取穿透、快取擊穿、快取雪崩、快取熱點,傻傻分不清楚

快取擊穿

快取擊穿是指在查詢快取資料時,資料庫原本有得資料,但是快取中沒有,生成快取資料需要耗費較長時間或者大量資源,這時候如果有大量請求該資料,會對資料庫甚至系統造成較大壓力。

阿珍:“哦?該怎麼解決呀?”

老徐:“這個很好解決,一般有兩個做法。”

第一個是:對快取更新操作加入鎖的保護,保證只有一個執行緒能夠進行快取更新的操作,沒有獲取更新鎖的執行緒要麼等待鎖釋放後重新讀取快取,要麼直接返回空值或者預設值。

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

微信掃描二維碼關注後回覆「電子書」,獲取12本Java必讀技術書籍。
老徐和阿珍的故事:快取穿透、快取擊穿、快取雪崩、快取熱點,傻傻分不清楚

快取雪崩

快取雪崩是指當大量快取同時失效或過期後,大量請求直接訪問對資料庫,甚至耗費較長時間或者大量資源計算快取結果,引起系統效能的急劇下降。

阿珍搶先說道:“這個我知道怎麼解決!”老徐反問:“怎麼解決?”

阿珍回答:“同一型別的快取的過期時間可以設定一個隨機值,比如:原來的過期時間是5分鐘,在此基礎上加060秒,那麼過期時間就變為在56分鐘內波動,有效防止都在同一個時間點上大量快取過期。”

快取熱點

快取熱點是指大部分甚至所有的業務請求都命中同一份快取資料。

雖然快取本身的效能比較高,但對於一些特別熱點的資料,如果大部分甚至所有的請求都命中同一份快取資料,則這份資料所在的快取伺服器的壓力也會很大。比如,電商的爆品秒殺活動,短時間內被上千萬的使用者訪問。

阿珍:“遇到了這種情況,該怎麼辦呀?”

老徐:“這個很好解決的,一般有兩種辦法:複製多份快取副本和本地記憶體快取。”

複製多份快取副本,就是將請求分散到多個快取伺服器上,減輕快取熱點導致的單臺快取伺服器壓力。在設計快取副本的時候,有一個細節需要注意:不同的快取副本不要設定統一的過期時間,否則就會出現所有快取副本同時生成同時失效的情況,從而引發快取的雪崩效應。

微信掃描二維碼關注後回覆「電子書」,獲取12本Java必讀技術書籍。
老徐和阿珍的故事:快取穿透、快取擊穿、快取雪崩、快取熱點,傻傻分不清楚

把熱點資料快取在客戶端的本地記憶體中,並且設定一個失效時間。對於每次讀請求,將首先檢查該資料是否存在於本地快取中,如果存在則直接返回,如果不存在再去訪問分散式快取的伺服器。

阿珍用崇拜的眼神看著老徐,說:“老徐,你太牛了,什麼都懂!”

老徐不好意思地撓了撓頭,說:“也沒有了。”

微信掃描二維碼關注後回覆「電子書」,獲取12本Java必讀技術書籍。
老徐和阿珍的故事:快取穿透、快取擊穿、快取雪崩、快取熱點,傻傻分不清楚

最後,謝謝你這麼帥,還給我點贊關注

相關文章