通过上面的流程明白了 Redis 集群是如何构建起来的,现在有个问题是假设有一条写命令发送到集群中,那么最终应该由那个节点实际执行呢?举个例子,集群由三个主节点组成,执行 set key1 value1 命令。Redis 集群通过槽指派机制来决定写命令应该被分配到那个节点。整个集群对应的槽是由 16384 大小的二进制数组组成,集群中每个主节点分配一部分槽,每条写命令落到二级制数组中的某个位置,该位置被分配给了那个节点则对应的命令就由该节点去执行。槽指派对应的二进制数组如下图所示:

    Redis 集群槽指派流程:假设有一条写命令发送到集群中,那么最终应该由那个节点实际执行呢 - 图1

    举个例子:假设节点 1 执行 0 - 4999,节点 2 执行 5000 - 9999,节点 3 执行 10000 - 16383, set key1 value1 命令通过 CRC16(key1) & 16383 = 8876,即认为该命令最后落到二级制数组的 8876 位置,则该命令最终由节点 2 执行。在比如在节点 2 执行一条命令时,假设通过 CRC 计算后得到的值为 889,则其应该有节点 1 执行,此时命令会发生一个转向操作,将要执行的命令转向到节点 1 上去执行,其具体工作原理如下:

    Redis 集群槽指派流程:假设有一条写命令发送到集群中,那么最终应该由那个节点实际执行呢 - 图2