(扩展一)Redis大key问题

大 key 定义:

    1. 一个简单的key存储的value值特别大

    2. hash, set, zset, list 中存储过多的元素

    3. 某个集群存储了许多许多的key

    4. 大 Bitmap 或布隆过滤器 (Bloom)

风险

  1. 对大key的操作会产生堵塞,轻则慢查询引起超时,重则节点hang住引发主从切换
  2. 大key造成集群节点容量倾斜,所在节点成为容量瓶颈
  3. 大key影响整个集群,如果同集群的其他业务有大key,整个集群都会受影响

解决方法: 拆分+清理

1:一个简单的key存储的value值特别大

  • 分拆成几个key-value,使用multiGet获取值,缓解单次压力。并且将压力平摊到多个redis实例中
  • 也可以使用hget,hmget来获取部分的value,使用hset,hmset来更新部分属性

2hash setzsetlist 中存储过多的元素

     利用计算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。

参考:https://blog.csdn.net/chanllenge/article/details/85673259

【注意事项二】可能存储的时候有顺序

3:某个集群存储了许多许多的key

  • string转hash用来减少key的个数
  • 计算key的hash值采用上述hash拆分一样的流程

猜你喜欢

转载自blog.csdn.net/lss446937072/article/details/109631698