HASH_SLOT = CRC16(key) mod 16384用Redis中的代码表示如下(这个代码被稍微修改了一下,后面会还原):
crc16(key) & 0x3FFF经过简单的计算就得到了当前key应该是存储在哪个slot里面,值得注意的是,指定的key会被存储在哪个slot,这个关系是铁打不变的。如果我提交了一批命令,往Redis中存储一批键,那么这些键一般会被映射到不同的slot,而不同的slot又可能由Redis Cluster中不同的节点服务,这样就和的预期有点不同,有没有办法将这批键映射到同一个slot呢?答案是可以。
abc{userId}def和ghi{userId}jklredis在计算槽编号的时候只会获取{}之间的字符串进行槽编号计算,这样由于上面两个不同的键,{}里面的字符串是相同的,因此他们可以被计算出相同的槽,相关代码如下:
unsigned int keyHashSlot(char *key, int keylen) {客户端是怎么在Redis Cluster中找到正确的节点的呢?下面看看。
int s, e;
for (s = 0; s < keylen; s++)
if (key[s] == '{') break;
if (s == keylen) return crc16(key,keylen) & 0x3FFF;
for (e = s+1; e < keylen; e++)
if (key[e] == '}') break;
if (e == keylen || e == s+1) return crc16(key,keylen) & 0x3FFF;
return crc16(key+s+1,e-s-1) & 0x3FFF;
}
GET msg表示客户端想要的254槽由运行在IP为127.0.0.1,端口为6381的Master实例服务。如果根据key计算得出的槽恰好由当前节点负责,则当期节点会立即返回结果。这里明确一下,没有代理的Redis Cluster可能会导致客户端两次连接急群中的节点才能找到正确的服务,推荐客户端缓存连接,这样最坏的情况是两次往返通信。
-MOVED 254 127.0.0.1:6381
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |