Redis:代码实战之数据倾斜

【关于作者】

关于作者,目前在蚂蚁金服搬砖任职,在支付宝营销投放领域工作了多年,目前在专注于内存数据库相关的应用学习,如果你有任何技术交流或大厂内推及面试咨询,都可以从我的个人博客(https://0522-isniceday.top/)联系我
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DOewH4BX-1681224984039)(https://zhangyuxiangplus.oss-cn-hangzhou.aliyuncs.com/boke/数据倾斜.png)]

1.数据倾斜

切片集群中,数据会按照一定的算法分布在slot上,而slot会分配到集群中每个redis实例上,而这个时候就会产生数据倾斜。

数据倾斜分为两类:

  • 数据量倾斜:某个实例上的数据量远大于其他实例
  • 数据访问倾斜:某个实例上数据量相差不大,但是某个实例都是存储的热点数据,访问的非常频繁

2.数据倾斜的原因和解决措施

2.1.数据量倾斜

  • 原因一:bigke导致数据倾斜,bigkey的value过大,导致数据倾斜

    解决措施:如果bigkey是集合类型,就将bigkey进行拆分为不同的一些小集合,再分散到每个实例上

  • 原因二:Slot分配不均衡,进行slot分配时,将过多的slot分配到某个实例

    解决措施:使用下面的命令完成数据迁移:

    1. CLUSTER SETSLOT:使用不同的选项进行三种设置,分别是设置Slot要迁入的目标实例,Slot要迁出的源实例,以及Slot所属的实例。
    2. CLUSTER GETKEYSINSLOT:获取某个Slot中一定数量的key。
    3. MIGRATE:把一个key从源实例实际迁移到目标实例。

    例如:假设我们要把Slot 300从源实例(ID为3)迁移到目标实例(ID为5),那要怎么做呢

    第1步,我们先在目标实例5上执行下面的命令,将Slot 300的源实例设置为实例3,表示要从实例3上迁入Slot 300。

    CLUSTER SETSLOT 300 IMPORTING 3
    

    第2步,在源实例3上,我们把Slot 300的目标实例设置为5,这表示,Slot 300要迁出到实例5上,如下所示:

    CLUSTER SETSLOT 300 MIGRATING 5
    

    第3步,从Slot 300中获取100 个key。因为Slot中的key数量可能很多,所以我们需要在客户端上多次执行下面的这条命令,分批次获得并迁移key。

    CLUSTER GETKEYSINSLOT 300 100
    

    第4步,我们把刚才获取的100个key中的key1迁移到目标实例5上(IP为192.168.10.5),同时把要迁入的数据库设置为0号数据库,把迁移的超时时间设置为timeout。我们重复执行MIGRATE命令,把100个key都迁移完。

    MIGRATE 192.168.10.5 6379 key1 0 timeout
    

    最后,我们重复执行第3和第4步,直到Slot中的所有key都迁移完成。

    从Redis 3.0.6开始,你也可以使用KEYS选项,一次迁移多个key(key1、2、3),这样可以提升迁移效率。

    MIGRATE 192.168.10.5 6379 "" 0 timeout KEYS key1 key2 key3
    
  • 原因三:hash tag 导致数据倾斜

    Hash Tag是指加在键值对的一对花括号,客户端在计算Slot时候会根据花括号中的key计算CRC的值

    例如:假设key是user:profile:3231,我们把其中的3231作为Hash Tag,此时,key就变成了user:profile:{3231}。当客户端计算这个key的CRC16值时,就只会计算3231的CRC16值

    解决措施:使用hash tag的场景往往都是涉及到范围查询,或者事务相关的,这里不建议使用hash tag,可以在代码中进行事务处理

2.2.访问量倾斜

数据访问量倾斜往往都是由于hot key导致,这里我们可以考虑hot key是否涉及写的场景,如果只有只读场景的话,我们可以将hot key的key拷贝多分,通过key的设置散列到多个实例,如果有读的场景就不能这样做了。

img

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈哈张大侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值