redis自學(46)鍵值設計

蓝海的bug本發表於2024-06-11

Redis鍵值設計

優雅的key結構

RedisKey雖然可以自定義,到但是最好遵循下面的幾個最佳實踐約定:

l 遵循基本格式:[業務名稱]:[資料名]:[id]

l 長度不超過44位元組(長度越小,佔用的記憶體越少)

l 不包含特殊字元

優點:

① 可讀性強

② 避免key衝突

③ 方便管理

④ 更節省記憶體:keystring型別,底層編碼包含intembstrraw三種。embstr在小於44位元組使用,採用連續記憶體空間,記憶體佔用更小。

拒絕BigKey

BigKey通常以Key的大小和Key中成員的數量來綜合判定,例如:

l Key本身的資料量過大:一個String型別的Key,它的值為5MB

l Key中的成員數過多:一個ZSET型別的Key,它的成員數量為10000個。

l Key中成員的資料量過大:一個Hash型別的Key,它的成員數量雖然只有1000個但這些成員的Value()總大小為100MB

判斷Key的大小

上面的命令對CPU的使用率比較高

透過字串長度判斷大小

集合透過集合中元素數量的方式來衡量

推薦值:

l 單個Keyvalue小於10KB

l 對於集合型別的Key,建議元素數量小於1000

BigKey的危害

n 網路阻塞

BigKey執行讀請求時,少量的QPS就可能導致頻寬使用率被佔滿,導致Redis例項,乃至所在物理機變慢

n 資料傾斜

BigKey所在的Redis例項記憶體使用率遠超其他例項,無法使用資料分片的記憶體資源達到均衡

n Redis阻塞

對元素較多的hashlistzset等做運算會耗時較久,使主執行緒被阻塞

n CPU壓力

BigKey的資料序列化和反序列化會導致CPU的使用率飆升,影響Redis例項和本機其它應用

如何發現BigKey

n redis-cli-bigkeys

利用reids-cli提供的--bigkeys引數,可以遍歷分析所有key,並返回Key的整體統計資訊與每個資料的Top1big key

n scan掃描

自己程式設計,利用scan掃描Redis中所有key,利用strlenhlen等命令判斷key的長度(此處不建議使用MEMORY USAGE

n 第三方工具

利用第三方工具,如Redis-Rdb-Tools分析RDB快照分析,全面分析記憶體使用情況

n 網路監控

自定義工具,監控進出Redis的網路資料,超出預警值時主動告警

如何刪除BigKey

BigKey記憶體佔用較多,即便是刪除這樣的key也需要耗費很長時間,導致redis主執行緒阻塞,引發一系列問題。

Reids3.0及以下版本

如果是集合型別,則遍歷BigKey的元素,先逐個刪除子元素,最後刪除BigKey

Redis4.0以後

Redis4.0後提供了非同步刪除的命令:unlink

恰當的資料型別

如何選擇合適的資料型別

相關文章