1.产生背景的原因

当系统的业务量大的时候,一台Redis是无法满足需求的,需要引入多台redis共同完成缓存任务,这样便带来了一个 数据(key)如何分的问题

2.三台Redis搭建的步骤

略,有空补上

3.计算分片的算法

3.1Hash取余算法

  1. 步骤

    1. 取key的hashCode与上最大的整数,除余Redis台数(key.hashCode&Integer.MAX_VALUE%N)

      3.2Hash一致性算法

  2. 步骤

    1. 取每台 redis的ip:port 字符串,并取其hashCode
    2. 将hashCode映射到一个 长度为 0~42亿多的hash环上
    3. 用户操作设置的key-value对,key的也映射到hash环上
    4. key-value对顺时针寻找redis节点
    5. 若节点存在权重,可引入虚拟节点
  3. 原理图(用达内的图了)

a.redis节点映射到hash环
image.png
b.key-value对映射到hash环,瞬时针找最接近的node即可
image.png

c.引入虚拟节点
image.png

  1. 缺点

    1. 增加一个结点(扩容时),需要迁移的数据量大
    2. key-value和节点产生了强耦合

      3.3 hash取模(redis集群使用的策略)

  2. 计算步骤

    1. 获取key的hashCode值
    2. 对hashCode值做CRC16算法计算
    3. 将得到的结果对16384(2)进行取余,所得的结果是槽道号的值[0~16383]

2.CRC16算法

  1. 用于生成文件的校验码。以此来检验数据通过文件、网络传输过程中的正确性
  2. 其主要步骤,将原数据的01编码,除以 CRC16除数,余数加入原数据编码尾部即可
  3. 接收方需要将数据除以CRC16码,最后查看结果是否为0??