redisのcrc 16は何の役に立ちますか?
redisのcrc 16は何の役に立ちますか?
crc 16アルゴリズムはredisの格納hashスロットに対する処理である
redisのhashスロットは16348個であり,理論的にはredisがクラスタ配置の化に最大でサポートされるのは16348個である.
redisのmulti-keyは確かに巧みで,{}という記号のkeyに対してhashが同じノードに保証される特殊な処理を行うことができ,redisマルチクラスタの下でkeyがアルゴリズムによってルーティングされた後に交差して集合できない操作を解決した.
hashスロット(16383)modの前にkeyに対してCRC 16のアルゴリズム検証が必要であり、この方法はクラスタ上のkeyセグメントの均一性を保証することができる
まず&取余は制限条件があります:除数は2のn次べき乗でなければならないredisの取余方式は正式にこの制限条件に基づいて&0 x 3 FFを使って取余操作を行うことができます
crc 16アルゴリズムはredisの格納hashスロットに対する処理である
redisのhashスロットは16348個であり,理論的にはredisがクラスタ配置の化に最大でサポートされるのは16348個である.
redisのmulti-keyは確かに巧みで,{}という記号のkeyに対してhashが同じノードに保証される特殊な処理を行うことができ,redisマルチクラスタの下でkeyがアルゴリズムによってルーティングされた後に交差して集合できない操作を解決した.
hashスロット(16383)modの前にkeyに対してCRC 16のアルゴリズム検証が必要であり、この方法はクラスタ上の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の取余方式は正式にこの制限条件に基づいて&0 x 3 FFを使って取余操作を行うことができます