我们这里首先来看?redis?这边实现比较复杂的?cluster集群模式?
整个?cluster集群 中会包含多对 Master+Slave 的组合, 然后这多对?Master+Slave 来分解?16384 个?slot
然后?客户端这边 set, get 的时候,?先根据?key?计算对应存储的 slot, 然后?服务器这边响应 MOVED +?目标机器?给客户端,?然后客户端这边?重新连接目标机器,?然后?将原有的命令发送到 目标机器上面
服务器这边主要是如果目标slot在本机,?则进行业务处理,?否则进行一个?转发的处理
客户端这边的处理就是,?向服务器发送命令,?如果服务器正常响应,?则处理正常,?如果服务器返回?MOVED + 目标机器,?则连接目标机器,?然后发送命令?
所以?这个集群其实就是 转发 +?几对主从, 来实现的集群,?然后?主从本身提供了服务的高可用,?多备份,?完整性,?一致性?
转发?+?几对主从,?提升了集群的处理效率,?吞吐量等等?
?
?
在客户端上面发送命令?“set name4 jerry”
?
?
服务器这边的转发处理如下,?这里是转发的最终结果?
客户端目前连接的是 “192.168.220.132:7004”, 然后这里服务器根据?”name4” 计算,?需要转发的机器是?“192.168.220.132:7005”,?以及?slot 是?8736
?
计算?slot 的方式如下,?传入?“name4” 然后根据?keyHashSlot 进行?slot?的计算, 具体的计算规则?我们可以不用关心, 只需要知道?一个 key?会计算到一个固定的?slot?就行?
?
计算的方式如下,?如果是包含?“{” 和?“}” 计算?之间的部分,?基于?crc16(str) % 16384
否则计算?crc16(key) % 16384
?
?
这里打印了日志,?更新了?config.hostip, config.hostport 以及刷新了 prompt 的信息?
?
然后在外面的发送命令的循环中,?会重新和目标服务器建立间接,?然后重新发送命令?
?
然后转发到目标服务端这边的时候,?客户端这边?调用堆栈如下
?
?
服务器这边的处理如下,?这个就是?常规意义上的真实的 set?命令的落地处理了?
?
在?processCommand 中,?调用真实业务处理的是在这里, 在处理的末尾了?
?
然后上面的计算?keyHash, 计算集群节点跳转的处理,?是在上面的地方?
如果是计算出来,?是其他节点,?才跳转,?否则?继续往后走,?走正常执行业务的处理?
?
?
完
?
?
?