首页 > 其他 > 详细

多重分表分库一般解决方案

时间:2020-04-07 00:04:28      阅读:85      评论:0      收藏:0      [点我收藏+]

1 设 d个地区,每个地区c个集群,每个集群b个库,每个库a个表

index=hash % (a*b*c*d)

地区所在:index/(a*b*c)

index=index % (a*b*c)

集群所在:index/(a*b)

index=index % (a*b)

库所在:index/(a)

index=index % (a)

表所在:index

 

2 举个例子

1个地区d

2个集群c

4个库b

5个表a

某个key初始index=28,共40个槽,我们可以想出,27所在第1个地区,第2个集群,第2个库,第4个表(0、1、2、3)

我们用公式:

地区=28/40=0;index=28

集群=28/20=1;index=8

库   =  8/  5=1;index=3

表   =3

索引从0开始

 

3 分表分库

此时d=c=1,公式简化为:

index=hash % (a*b*1*1)=hash %(a*b)

地区所在:index/(a*b*1)=0

index=index % (a*b*1)=hash %(a*b)

集群所在:index/(a*b)=0

index=index % (a*b)=hash %(a*b)

库所在:index/(a)

index=index % (a)

表所在:index

技术分享图片

 

4 分表

index=index % (a*b)=hash %(a*b)=hash %(a)

库所在:index/(a)=0

index=index % (a)=hash %(a)

表所在:index

 

ip白名单算法(pdd活跃用户) 

a=8(每个字节存8个bit,一个bit一个ip),b=0.5g

index=index % (a*b)=hash %(a*b)=hash=val 属于 [0, 2^32-1]

注意,java的hash用int型,浪费一个符号位,其取值属于 [0, 2^31-1],且所有ip在[0, 2^31-1]上均匀不重合分布

b所在:index/(a)=val / 8

index=index % (a)=val % 8

a所在:index

 

6 ip白名单redis版,同样在上面那片文章中

d=1,c=4(4个redis实例),b=128m,a=8

index=hash % (a*b*c*d)=val % (a*b*c)=val % 4g=val % 2^32=val(because:val [0, 2^32-1])

地区所在:index/(a*b*c)=0

index=index % (a*b*c)=val

集群c所在:index/(a*b)=val / 1g

index=index % (a*b)=val % 1g

库b所在:index/(a)=val % 1g / 8

index=index % (a)=val % 1g % 8

表a所在:index

多重分表分库一般解决方案

原文:https://www.cnblogs.com/silyvin/p/12650190.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!