大Key、熱Key的發現與處理
更新時間 2024-01-23 16:33:09
最近更新時間: 2024-01-23 16:33:09
分享文章
定義
名詞 定義 大Key
容量比較大的。String類型,單個Key對應的大小大于10KB。其他集合類型的Key,所有成員總大小大于1MB的
Key的元素較多。一般定義集合類型的Key中元素超過3000個,則認為其為大Key
熱Key
一個Key被操作的頻率和資源占用多少來判定其是否為熱Key
訪問頻率高:比如總QPS(每秒查詢率)為5,000,而其中一個Key的每秒訪問量達到了3,000
帶寬使用率高:某個Key大小可能占了1MB,每秒內頻繁去查詢, 占用了網絡的大部分帶寬
大Key和熱Key引發的問題
場景 問題 大Key 客戶端執行命令的時長變慢 Redis內存達到maxmemory參數定義的內存使用上限,導致操作阻塞或重要的Key被逐出,更可能引發OOM導致被操作系統殺死 對大Key頻繁執行讀請求,會占用大量網絡帶寬,導致服務變慢,同時易影響其他使用的服務 對大Key執行修改或刪除,可能造成主庫較長時間的阻塞,進而可能引發同步中斷或主從切換 對集群版或CLUSTER版實例,容易造成內存使用不均 熱Key 占用大量的CPU資源,影響其他請求響應,導致整體性能降低 對集群版或CLUSTER版實例,容易造成分片壓力分配不均的情況。會導致單個分片成為性能瓶頸點 容易造成緩存擊穿。可能超出緩存的承受能力,緩存處理不過來。大量業務請求可能直接訪問后端數據庫,數據庫承受不了大量請求訪問可能導致服務不可用,嚴重影響業務
大Key和熱Key產生的原因
未正確使用Redis、業務規劃不足、無效數據的堆積、訪問量突增等都會產生大Key與熱Key,如:
大Key:
- 在不適用使用Redis,Key對應的value過大,如使用String類型的Key存放大體積二進制文件型數據;
- 沒有對Key中的成員進行合理的拆分,造成個別Key中的成員數量過多。
- 未定期清理無效數據,造成如LIST、HASH等集合類型Key中的成員持續不斷地增加;
熱Key:
- 業務安排的不合理,沒有對Key進行合理的拆分,業務都集中訪問同一個Key。
- 預期外的訪問量陡增,如訪問量暴漲的熱點新聞等。
如何發現大Key和熱Key
方法 說明 大Key和熱Key功能分析 參考文檔:大Key和熱Key分析 通過redis-cli的bigkeys和hotkeys參數查找大Key和熱Key Redis-cli提供了bigkeys參數,能夠使redis-cli以遍歷的方式分析Redis實例中的所有Key,并返回Key的整體統計信息與每個數據類型中Top1的大Key,bigkeys僅能分析并輸入六種數據類型(STRING、LIST、HASH、SET、ZSET、STREAM),命令示例為:redis-cli?-h?<實例的連接地址>?-p?<端口>?-a?<密碼>?--bigkeys。 自Redis?4.0版本起,redis-cli提供了hotkeys參數,可以快速幫您找出業務中的熱Key,該命令需要在業務實際運行期間執行,以統計運行期間的熱Key。命令示例為:redis-cli?-h?<實例的連接地址>?-p?<端口>?-a?<密碼>?--hotkeys。熱Key的詳情可以在結果中的summary部分獲取到。 通過Redis內置命令對目標Key進行分析 對不同數據類型的目標Key,分別通過如下風險較低的命令進行分析,來判斷目標Key是否符合大Key判定標準。
STRING類型:執行STRLEN命令,返回對應Key的value的字節數。
LIST類型:執行LLEN命令,返回對應Key的列表長度。
HASH類型:執行HLEN命令,返回對應Key的成員數量。
SET類型:執行SCARD命令,返回對應Key的成員數量。
ZSET類型:執行ZCARD命令,返回對應Key的成員數量。
STREAM類型:執行XLEN命令,返回對應Key的成員數量。
通過業務層定位熱Key 通過在業務層增加相應的代碼對Redis的訪問進行記錄并異步匯總分析。
如何處理大Key和熱Key
場景 方法 說明 大Key 對大Key進行拆分 例如將含有數萬成員的一個HASH?Key拆分為多個HASH?Key,并確保每個Key的成員數量在合理范圍。在Redis集群架構中,拆分大Key能對數據分片間的內存平衡起到顯著作用 對大Key進行清理 將不適合Redis的數據存至其它存儲,并在Redis中刪除此類數據 對過期數據進行定期清理 堆積大量過期數據會造成大Key的產生,例如LIST或HASH類型數據都以增量的方式寫入數據,而忽略數據的有效性和時效性。可以定時清理這些過期失效數據。
可配合緩存分析功能使用熱Key 使用客戶端本地緩存 設計客戶端(本地)和Redis的兩級緩存架構。熱點數據優先從本地緩存獲取。對于一些不頻繁修改的數據,可優先使用本地緩存 Redis集群架構中對熱Key進行復 集群架構中,可以將對應熱Key進行復制并遷移至其他數據分片,例如將熱Key 復制出3個內容完全一樣的Key,將這三個Key遷移到其他數據分片來解決單個數據分片的熱Key壓力