集群配置
- 公司内部使用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