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

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