Redis-哈希槽

Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念。

哈希槽的用途:

  1. Redis 集群中内置了 16384 个哈希槽,集群的每个节点分管其中的一部分hash槽。
  2. 当需要在 Redis 集群中放置一个 key-value时,
  3. redis 会先根据CRC16算法计算该key对应的值,
  4. 然后用该值对 16384 取模,根据取模后的结果来决定放置哪个槽,
  5. 这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会再将哈希槽映射到不同的节点。

哈希槽带来的好处:

    这种结构很容易添加或者删除节点,我们以后新增或移除节点的时候不用先停掉所有的 redis 服务,即,无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态,比如:

    1)在增加的时候,之前的节点各自分出一些槽给新节点,对应的数据也一起迁出;

    2)同样,当需要移除节点时,只需要把要移除的节点上的哈希槽挪到其他节点上就行了;

    3)客户端可以向任何一个Redis节点发送请求,然后由节点将请求重定向到正确的节点上 。

为什么要选择的槽是16384个呢?

            crc16会输出16bit的结果,可以看作是一个分布在0-2^16-1之间的数,redis的作者测试发现这个数对2^{14}求模的会将key在0-2^{14-1}之间分布得很均匀,因此选了这个值。

为什么没有用一致性哈希算法?

            "用了哈希槽的概念,而没有用一致性哈希算法,不都是哈希么?这样做的原因是为什么呢?"<br />

Redis Cluster是自己做的crc16的简单hash算法,没有用一致性hash。Redis的作者认为它的crc16(key) mod 16384的效果已经不错了,虽然没有一致性hash灵活,但实现很简单,节点增删时处理起来也很方便。