槽道原理

1. 槽道原理解决的2个问题
• 节点redis-server接收写命令之后,根据key的计算结果槽道号判断所属权?
• 判断所属权失败(false),从哪获取正确槽道的管理信息(节点ip:port)?

2. 槽道原理
2.1槽道的组成部分
• 16384位的二进制,本质上一个2048个元素的byte数组;通过对二进制的计算,获取(自定义的)下标,下标正好对应的槽道号,每个维护槽道的节点都会存储这样一个二进制的值,管理的和不管理的槽道号都会在二进制中体现,管理的槽道号对应的二进制值是 “1”/true,不管理的就是"0"/false,当一个key值传递到节点上做hash取模计算之后得到的0-16383的整数,到二进制判断结果1/0
• 16384个元素的数组,数组的元素值引用的变量,变量指向内存中保存的集群所有节点的信息的对象数据,每个节点都维护了一个完全一样的数组对象,只要判断槽道所属权是false将会调用这个数组的元素值(利用数组下标 0-16383),元素值的意义就是下标对应槽道号的管理节点信息的引用对象
2.1二进制(位序列)
在这里插入图片描述
○ 二进制的值的特点:
主节点: 有槽道管理权的,二进制不仅仅各不相同,同一个槽道号的二进制值,只能有一个是1,剩下全是0;没有槽道管理权的节点.二进制值是16384位个0
从节点: 从节点没有槽道管理权,定死了一件事,所有的key的槽道号计算完毕后,都会到索引数组中获取节点信息,.不会计算位序列,备份了一个主节点的二进制.–从节点只备份位序列.不使用
○ 二进制的值赋值
创建集群时将节点管理的槽道号对应的二进制值从0变成1
○ 二进制怎么算的下标

public void test(){
	byte binary=126;
	//槽道号0 管理权fasle
	//槽道号1 管理权true
	//槽道号2,管理权true
	//槽道号7,管理权false
	System.out.println(Integer.toBinaryString(binary));
	for(int i=0;i<8;i++){
		//计算126对应的槽道号的二进制
		// 01111110
		int result=binary>>(7-i)&1;
		//System.out.println(Integer.toBinaryString(result));
		boolean belong= result==1? true:false;
		System.out.println("槽道号为:"+i+";所属权为:"+belong);
	}
}

2.2索引数组/共享数组)
○ 节点相互握手的过程中,每个节点都会记录集群的所有节点的信息对象
在这里插入图片描述
创建集群时,需要节点与节点进行握手meet,一旦meet成功相当于把对方的信息对象(ip,id,port,ms关系,time)抓取到了自己的内存管理保存
○ 对槽道的相关操作,会在每个节点中的数组对象里保存一个引用值
在这里插入图片描述
集群最终创建完毕之后,每个节点内的数组结构
在这里插入图片描述
解决第二个问题
在这里插入图片描述
○ 数组中每一个下标对应的都是槽道号,对应元素内容,除了有管理槽道的节点的对象引用意外,还有其他数据(key值的对应关系)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值