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
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