熱key問題描述
熱key問題就是突然有幾十萬的請求去訪問redis上的某個特定key,那麼這樣會造成流量過於集中,達到物理網卡上限,從而導致這臺redis服務器直接宕機。
如何發現熱點key
-
憑藉業務經驗,進行預估哪些是熱key。比如某些商品要做秒殺,則商品key就可以判斷爲熱key,但並非所有業務都能預估出熱key。
-
在客戶端進行收集。比如在redis客戶端執行redis命令之前,加入一行代碼進行命令數據收集,然後通過網絡將收集的命令發送出去,缺點是對客戶端代碼有入侵。
-
在Proxy層做收集,但是並非所有的redis集羣都有proxy。
-
用redis自帶命令,monitor命令可以實時抓取出redis服務器接收到的命令,然後寫代碼統計出熱key是啥,不過高併發條件下,有內存暴增的隱患,影響redis的性能。redis4.0.3提供了客戶端熱點key發現功能,如果key比較多,執行比較慢。
-
自己抓包評估,redis客戶端使用TCP協議與服務端進行交互,通信協議採用RESP,自己寫程序監聽端口,按照RESP協議規則解析數據進行分析,不過開發成本較高,不易維護。
如何解決熱key
-
增加二級緩存,發現熱key以後,可以把熱key數據加載到系統JVM並設置合適的緩存過期時間,針對熱key的請求就會直接分散到各業務服務器上,防止所有請求同時訪問同一臺redis。
-
備份熱key。可以把熱點key的數據備份到所有redis的集羣節點中,可以通過在熱點key後面拼接集羣節點編號,然後將這些備份key分散到所有集羣節點中,客戶端訪問熱點key的時候也在熱點key後面隨機拼接集羣節點編號,將熱點key的請求分散到不同集羣節點上。
作者:京東零售 曹志飛
來源:京東雲開發社區 轉載請註明來源