redis的crc16有什么用?

redis的crc16有什么用?

crc16算法 是针对redis的存储hash槽 进行的处理

redis的hash槽为16348 个,理论上redis如果为集群部署的化 最大支持的就是16348个

redis的multi-key 确实很巧妙 ,针对 {} 这个符号的key 可以做到特殊处理 保证 被hash到同一个节点上,解决了redis 多集群下 key 通过算法进行路由后 无法进行交集 并集的操作

针对hash槽 (16383)mod 之前 需要 针对key 进行CRC16的算法校验 ,这种方式是可以保证 集群上的key 分部的均匀性

Redis Cluser采用虚拟槽分区,所有的键根据哈希函数映射到0~16383个整数槽内,计算公式:slot=CRC16(key)&16383。
由于采用高质量的哈希算法,每个槽所映射的数据通常比较均匀。

/* --------------cluster.c---------------------------------------------------------------  * Key space handling  * -------------------------------------------------------------------------- */  /* 

We have 16384 hash slots. The hash slot of a given key is obtained  * as the least significant 14 bits of the crc16 of the key.  
*  * However if the key contains the {...} pattern, only the part between  * { and } is hashed. This may be useful in the future to force certain  * keys to be in the same node (assuming no resharding is in progress). */  
//我们有16384个哈希槽,将会用crc16得到的最小有效14位作为给定key的哈希槽。  
//但是,如果键包含‘{...}’这样的字段,只有在"{“和“}”之间的才会被哈希。这在将来可能有助于将某些键强制放在同一个节点中(假设没有进行重新分片   // 计算给定键应该被分配到哪个槽 
unsigned int keyHashSlot(char *key, int keylen) {     int s, e; /* start-end indexes of { and } */      for (s = 0; s < keylen; s++)         if (key[s] == '{') break;      
/* No '{' ? Hash the whole key. This is the base case. */     //0x3FFF转化成十进制就是16383     
if (s == keylen) return crc16(key,keylen) & 0x3FFF;      /* '{' found? Check if we have the corresponding '}'. */     for (e = s+1; e < keylen; e++)         if (key[e] == '}') break;      /* No '}' or nothing betweeen {} ? Hash the whole key. */     if (e == keylen || e == s+1) return crc16(key,keylen) & 0x3FFF;      /* If we are here there is both a { and a } on its right. Hash      * what is in the middle between { and }. */     return crc16(key+s+1,e-s-1) & 0x3FFF; } 

首先用&取余是有限制条件的:
除数必须是2的n次幂才行
redis的取余方式 正式基于这个限制条件 才可以使用 & 0x3FF 来进行取余操作

你可能感兴趣的:(R型笔记,R型笔记,redis)