大 key 定义:
1. 一个简单的key存储的value值特别大
2. hash, set, zset, list 中存储过多的元素
3. 某个集群存储了许多许多的key
4. 大 Bitmap 或布隆过滤器 (Bloom)
风险
- 对大key的操作会产生堵塞,轻则慢查询引起超时,重则节点hang住引发主从切换
- 大key造成集群节点容量倾斜,所在节点成为容量瓶颈
- 大key影响整个集群,如果同集群的其他业务有大key,整个集群都会受影响
解决方法: 拆分+清理
1:一个简单的key存储的value值特别大
- 分拆成几个key-value,使用multiGet获取值,缓解单次压力。并且将压力平摊到多个redis实例中
- 也可以使用hget,hmget来获取部分的value,使用hset,hmset来更新部分属性
2:hash, set,zset,list 中存储过多的元素
利用计算key的hash值分摊到多个容器中
如:固定一个桐数量100,每次存取的时候本地计算field的hash值,模除 100,决定落到哪个key上面。存的时候按照key_XX存储,取的时候从key_0一直到key_99,都取出来再放到一起
【注意事项一】hash计算值有负数!可能拼出key_-14这样。如果使用Math.abs(key.hashcode/100)需要注意hashcode是int类型最小为Integer.MIN_value。他的Math.abs还是负数。解决办法是使用与位运算:hash = key.hashCode() & Integer.MAX_VALUE。
【注意事项二】可能存储的时候有顺序
3:某个集群存储了许多许多的key
- string转hash用来减少key的个数
- 计算key的hash值采用上述hash拆分一样的流程