Redis hotkeys查詢與優化
HotKeys是redis中被請求訪問頻率較高的Key,通常占用大量的帶寬和QPS。如果在使用過程中沒能及時發現并處理,可能會導致服務性能下降、用戶體驗變差,甚至引發大面積故障。通常預期外的訪問陡增、熱點事件等會導致HotKeys產生。
hotkeys查找
redis保存有每個key的訪問頻度,出現hotkeys后,可以通過下面方法定位(由于下面兩種方式都需要實時占用系統資源,可能對運行中的系統造成影響,最有效還是通過業務層定位hotkeys,在無法確認后再使用下面方法)。
通過redis-cli的hotkeys參數查詢hotkeys
客戶端redis-cli支持hotkeys參數,類似bigkeys實現邏輯,使用scan指令,采樣實例的key,記錄并輸出訪問頻度最高的key。
通過monitor命令分析hotkeys
Redis的monitor命令能夠打印Redis中的所有請求,包括時間信息、Client信息、命令以及Key信息,可以通過短暫執行monitor命令并將輸出重定向至文件,分析找出該時間段中的hotkeys。
hotkeys優化
分析出hotkeys后,通常使用對key降低請求密度來優化處理,即訪問遷移或多節點支持。
使用讀寫分離
如果熱Key的產生來自于讀請求,那么讀寫分離是一個很好的解決方案。在使用讀寫分離架構時可以通過不斷的增加從節點來降低每個Redis實例中的讀請求壓力。
在請求量極大的場景下,讀寫分離架構會產生不可避免的延遲,此時會有讀取到臟數據的問題,需要重點關注是否滿足場景需求。
分片集群key拆分
分片集群中,對hotkeys的請求打散到多分片來減少單個分片的壓力,需要使用多key分別遷移到不通的分片上,應用通過請求不同的key來減少單個分片的壓力。如hotkey foo復制出3個內容完全一樣的Key并名為foo2,foo3,foo4,然后將這三個Key遷移到其他node來解決單一node的熱Key壓力。
但是該方案需要應用聯動修改,同時,Key變多帶來了數據一致性挑戰:由更新一個Key演變為需要同時更新多個Key。