當資料庫成為瓶頸時,比如高并發、讀多寫少等場景,我們首先會想到的就是利用快取來提高整個系統的性能,
快取雖然能夠大大提升整個系統的性能,但同時也引入了更多復雜性,
如果沒有針對快取進行比較好的處理,某些場景下甚至會導致整個系統崩潰,
這次我們要聊的就是:快取熱點
快取熱點
快取熱點是指大部分甚至所有的業務請求都命中同一份快取資料,
雖然快取本身的性能比較高,但對于一些特別熱點的資料,如果大部分甚至所有的請求都命中同一份快取資料,則這份資料所在的快取服務器的壓力也會很大,
比如,電商的爆品秒殺活動,短時間內被上千萬的用戶訪問,
解決辦法
快取熱點的常用解決方法有兩種:復制多份快取副本和本地記憶體快取,接下來我們詳細了解一下這兩種方法:
復制多份快取副本
復制多份快取副本,就是將請求分散到多個快取服務器上,減輕快取熱點導致的單臺快取服務器壓力,
以爆品秒殺活動為例,爆品資料都可以生成 100 個快取資料,快取的資料是一樣的,在快取的 key 里面加上編號進行區分,每次讀快取時都隨機讀取其中某個快取,
在設計快取副本的時候,有一個細節需要注意:不同的快取副本不要設定統一的過期時間,否則就會出現所有快取副本同時生成同時失效的情況,從而引發快取的雪崩效應,
正確的做法是設定一個過期時間范圍,不同的快取副本的過期時間是指定范圍內的隨機值,
本地記憶體快取
把熱點資料快取在客戶端的本地記憶體中,并且設定一個失效時間,對于每次讀請求,將首先檢查該資料是否存在于本地快取中,如果存在則直接回傳,如果不存在再去訪問分布式快取的服務器,
與復制多份快取副本比較,本地記憶體快取徹底“解放”了快取服務器,不會對快取服務器有任何壓力,
不過,本地記憶體快取也有自己的缺點,假如快取服務器中資料被被更新了,本地記憶體快取沒有及時更新,就導致資料不一致的情況,
因此,本地記憶體快取的失效時間需要設定盡量短一些,
熱點快取的發現
在前面的討論中,我們預設了知道熱點快取有哪些,但是在大多數情況下,我們是無法知道哪些是熱點快取,
不過,我們可以使用以下方法及時發現熱點快取:
- 在客戶端進行統計,在讀取快取時,加入資料統計的邏輯,當讀取次數達到某個閾值時,判斷其為熱點快取,
- 在Proxy層進行統計,當讀取快取時有Proxy層時,可以在Proxy層加入資料統計的邏輯,
- 使用快取系統的自帶工具,比如Redis性能分析工具redis-faina、redis-cli的hotkeys引數,
總結
快取熱點是指大部分甚至所有的業務請求都命中同一份快取資料,
常用的解決方法有兩種:復制多份快取副本,每個副本過期時間設定為指定范圍內的隨機值;本地記憶體快取,快取失效時間盡量設定短一些,
微信公眾號:萬貓學社
微信掃描二維碼
關注后回復「電子書」
獲取12本Java必讀技術書籍
最后,感謝你的點贊和關注,帥氣又美麗,
作者:萬貓學社
出處:http://www.cnblogs.com/heihaozi/
著作權宣告:本文遵循 CC 4.0 BY-NC-SA 著作權協議,轉載請附上原文出處鏈接和本宣告,
微信掃描二維碼,關注萬貓學社,回復「電子書」,免費獲取12本Java必讀技術書籍,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430178.html
標籤:Java
上一篇:mybatis連接Oracle執行begin..end批量操作回傳行數問題
下一篇:【Java全堆疊進階】-構造方法
