0%

redis集群分区

文章字数:570,阅读全文大约需要2分钟

redis数据量大的时候就需要使用多个redis实例去共同存储数据。

固定取模

  • 过程
  1. 先把redis若干个主节点编号

    1
    2
    3
    Master1 : 1
    Master2 : 2, 3
    Master3 : 4, 5
  2. 再用hash值和编号总数量取模

    1
    hash(key) % total_virtual_weight
  • 缺点:当新增或者删除节点时,数据几乎全部都要重新洗牌。消耗过大,只能当做缓存

一致性哈希Consistent Hashing

  • 过程
  1. 假设有一个HSAH环,范围为2^32-1(即一个32位的无符号整形范围)
  2. 计算集群节点的HASH(通过ip,主机名之类的),并标记在HASH环上
  3. 客户端请求数据时会通过数据的HASH值向后找,找到的第一个节点处理此请求
  • 优点:相对于固定取模,删除节点或节点宕机所影响的数据更少。
  • 缺点: 删除节点时还是需要计算所有该节点的key,另外算出来的节点Hash值也可能导致数据分布不均匀的现象。

预先分配PreSharding

  • 过程
  1. 部署redis时一个机器上部署多个实例
  2. 需要拓展时将一台机器上的实例分发到多台机器上,以提升性能与空间
  • 优点:增长过程中redis的实例数保持不变
  • 缺点:实例多,增加了运维成本