目錄
一、BigKey 的概念
1.1 普通 key 的設計規則
1.2 BigKey 的定義
1.3 BigKey 存在的問題
二、BigKey 的發現與解決方案
第一種方式:redis-cli --bigkeys
第二種方式:scan掃描
第三種方式:第三方工具
第四種方式:網絡監控
一、BigKey 的概念
1.1 普通 key 的設計規則
遵循的基本格式:[業務名稱]:[數據名]:[id](login:user:1)
key 的長度建議:
長度不超過 44 字節(否則會占用更多內存)
key 的設計建議:建議盡量不要包含特殊字符
1.2 BigKey 的定義
BigKey 通常以 Key 的大小和 Key 中成員的數量來綜合判定,例如:
-
Key 本身的占用內存過大:一個 String 類型的 Key,它的值為 5 MB。
-
Key 中的成員個數過多:一個 ZSET 類型的 Key,它的成員數量為10,000個。
-
Key 占用內存大的同時數量眾多:一個Hash類型的Key,它的成員數量雖然只有1,000個但這些成員的Value(值)總大小為100 MB。
推薦大小與數量:
-
單個key的value小于10KB
-
對于集合類型的key,建議元素數量小于1000
1.3 BigKey 存在的問題
-
網絡阻塞導致帶寬被占滿:對 BigKey 執行讀請求時,少量的 QPS(每秒查詢率)就可能導致帶寬使用率被占滿,導致 Redis 實例,乃至所在物理機變慢。
-
內存資源分配不均勻:BigKey 所在的 Redis 實例內存使用率遠超其他實例,無法使數據分片的內存資源達到均衡
-
計算耗時久導致線程阻塞:對元素較多的 hash、list、zset 等做運算會耗時較久,使主線程被阻塞。
-
序列化導致 CPU?壓力飆升:對 BigKey 的數據序列化和反序列化會導致 CPU 的使用率飆升,影響 Redis 實例和本機其它應用
二、BigKey 的發現與解決方案
第一種方式:redis-cli --bigkeys
redis-cli --bigkeys:利用 redis-cli 提供的 --bigkeys 參數,可以遍歷分析所有 key,并返回Key 的整體統計信息與每個數據的 Top1 的 big key
第二種方式:scan掃描
scan掃描:自己編程,利用 scan 掃描 Redis 中的所有 key,利用strlen、hlen 等命令判斷 key 的長度(此處不建議使用MEMORY USAGE)
第三種方式:第三方工具
第四種方式:網絡監控
網絡監控:自定義工具,監控進出 Redis 的網絡數據,超出預警值時主動告警(阿里云 Redis 監控)