集羣配置
- 公司內部使用cache-client (搜狐開源緩存 https://github.com/sohutv/cachecloud)
- 一個取經團或者某個中心下使用一個appId(項目只需要配置appId,引入cache-client依賴即可使用緩存)
原因分析
- 拉取我們取經團下部分key分析,確認是否爲這部分key導致(通過RDB文件備份起來;並以json格式解析存儲) – 由於項目使用key過多 沒有發現問題
- 確認key或value中是否有 “{” 或 “}” ,因爲有這兩個字符會導致根據key生成hash值,落到集羣節點上的槽失效
- Redis對數據的特徵值(一般是key)計算哈希值,使用的算法是CRC16
- CRC16算法參見 https://blog.csdn.net/huang_shiyang/article/details/50881305
- 根據哈希值,計算數據屬於那個槽
- 根據槽與節點的映射關係,計算數據屬於哪個節點
- 參見 https://cloud.tencent.com/developer/article/1460946
- 發現大key或者value
- redis-cli --bigkeys
- 最終定位到key userIntention_**** 存在百萬級value情況
- 導致集羣中同一節點內存被佔滿
- 參見 https://www.cnblogs.com/svan/p/7050396.html?utm_source=itdadao&utm_medium=referral
問題解決
- 確認是代碼中使用hset導致
- 通過底層源碼可知 hset使用爲同一個key
- field只是作爲一個屬性
- 官方中文文檔有,但當時沒有真正理解(http://redisdoc.com/hash/hset.html)
- 使用set、setEx替換即可
延伸閱讀
- 如何處理redis集羣中的hot Key https://blog.csdn.net/harleylau/article/details/86246806
參見文檔
- redis-shake數據同步&遷移工具 https://yq.aliyun.com/articles/691794
- Redis集羣性能問題深度分析 https://blog.51cto.com/jerrymin/1981560
- 如何提取Redis中的大KEY https://www.cnblogs.com/svan/p/7050396.html?utm_source=itdadao&utm_medium=referral