回答
在 Redis Cluster 中,数据的分布是通过哈希槽来实现的。Redis 将所有的 key "均匀" 地分布在 16384
个哈希槽中,当我们使用某个 key 进行操作时,需要先确认该 key 是属于哪个哈希槽,然后再去进行操作。
Redis 采用 CRC16
算法对 key 进行哈希计算,然后将得到的哈希值与 16383
进行位与运算(hash % 16384
),这样就可以确保 key 被均匀地分布在 0 ~ 16383
这些槽位之间。
hash_slot=CRC16(key) mod 16384
扩展
CRC16
CRC16
(Cyclic Redundancy Check 16 bit)即循环冗余校验码,是一种常用的校验算法,主要用于数据通讯和数据存储领域,用于检测数据传输或存储中的错误。在 Redis Cluster 中,CRC16
用于计算 key 的哈希槽位置。
CRC16
是基于多项式运算,在计算时,数据被视为一个巨大的二进制数字。这个数字被除以另一个固定的二进制数字(称为"多项式"),并返回余数作为结果(即 CRC 值)。具体步骤如下:
- 预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器;
- 把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器,高八位数据不变;
- 把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
- 如果移出位为0:重复第3步(再次右移一位);如果移出位为1,CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
- 重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
- 重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
- 将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;
- 最后得到的CRC寄存器内容即为:CRC码。