一、记录节点的槽指派信息(struct clusterNode)
clusterNode结构见文章:传送门在此
clusterNode结构的slots属性和numslot属性记录了节点负责处理哪些槽:
struct clusterNode {
// ...
unsigned char slots[16384/8];
int numslots;
// ...
};
slots属性
slots属性是一个二进制位数组(bit array),这个数组的长度为16384/8=2048个字节,共包含16384个二进制位。
Redis以0为起始索引,16383为终止索引,对slots数组中的16384个二进制位进行编号, 并根据索引i上的二进制位的值来判断节点是否负责处理槽i:
- 如果slots数组在索引i上的二进制位的值为1,那么表示节点负责处理槽i
- 如果slots数组在索引i上的二进制位的值为0,那么表示节点不负责处理槽i
演示案例:
图展示了一个slots数组示例:这个数组索引0至索引7上的二进制位的值都为1,其余所有二进制位的值都为0,这表示节点负责处理槽0至槽7
下图展示了另一个slots数组示例:这个数组索引1、3、5、8、9、10上的二进制位的 值都为1,而其余所有二进制位的值都为0,这表示节点负责处理槽1、3、5、8、9、10
因为取出和设置slots数组中的任意一个二进制位的值的复杂度仅为O(1),所以对于一 个给定节点的slots数组来说,程序检查节点是否负责处理某个槽