乐趣区

关于redis:缓存服务器Redis-05-Redis分片机制

应用场景

当咱们须要 redis 存储大量的数据时, 只有一台 redis 服务器不可能满足需要; 但如果扩充内容, 因为须要长时间去寻址, 也不能达到要求.
就须要另一种形式

Redis 分片

阐明

个别是 采纳多台 Redis, 别离去存储用户的数据, 从而实现内存数据的扩容 .
对于用户而言: 会将 Redis 分片的多个 Redis 当作一个整体, 不在乎数据存在那个中, 只在乎能不能存储
分片的次要作用: 实现内存的扩容

筹备

1. 创立目录
在 redis 根目录中创立一个 shards 目录

2. 分片搭建
因为 Redis 启动是依据配置文件运行的, 所以如果须要筹备 3 台 redis, 则须要复制 3 份配置文件 redis.conf. 端口号顺次为 6379/6380/6381.
命令:cp redis.conf shards/6379.conf/cp redis.conf shards/6380.conf/cp redis.conf shards/6381.conf
3. 批改端口号
依据配置文件名称, 动静批改对应的端口即可 – 文件中 port 批改
4. 启动 Redis
启动 Redis 服务:

 redis-server  6379.conf
 redis-server  6380.conf
 redis-server  6381.conf

通过 ps -ef | grep redis 查看服务是否启动.

入门案例

 /**
     * 测试 Redis 分片机制
     * 业务思路:
     *      用户须要通过 API 来操作 3 台 redis. 用户无需关怀数据如何存储,
     *      只须要理解数据是否存储即可.
     */
    @Test
    public void testShards(){List<JedisShardInfo> list = new ArrayList<>();
        list.add(new JedisShardInfo("192.168.126.129", 6379));
        list.add(new JedisShardInfo("192.168.126.129", 6380));
        list.add(new JedisShardInfo("192.168.126.129", 6381));
        ShardedJedis shardedJedis = new ShardedJedis(list);
        shardedJedis.set("2020", "redis 分片");
        System.out.println(shardedJedis.get("2020"));
    }

一致性 hash 算法

通过上边的入门案例, 咱们能够看到有输入的 kv 后果, 证实咱们的分片是胜利进行了存储的, 然而咱们共启动了三个 redis 服务, 咱们通过服务端 keys * 命令的查找, 也发现, 其数据是存储在 6381 端口的 redis 中.
那么它是怎么判断存储在哪个 redis 中呢?– 这就用到了 hash 一致性算法

介绍

百度介绍如下:
一致性哈希算法在 1997 年由麻省理工学院提出,是一种非凡的哈希算法,目标是解决分布式缓存的问题 。在移除或者增加一个服务器时,可能尽可能小地扭转已存在的服务申请与解决申请服务器之间的映射关系。一致性哈希解决了简略哈希算法在分布式哈希表(Distributed Hash Table,DHT) 中存在的 动静伸缩等问题

hash

  1. 常见 hash 是 8 位 16 进制数
  2. 16 进制数取值:0-9 A-F 共 16 个数
  3. hash 的取值范畴:00000000-FFFFFFFF(00000000 与 FFFFFFFFF 是同一个数)
  4. 00000000-FFFFFFFF 共有 2^32 个数
  5. 对雷同的数据取 hash 值雷同

一致性 hash 阐明

步骤:
1.首先计算 node 节点 hash 值
2. 将用户的 key 进行 hash 计算, 之后依照顺时针的方向找到最近的 node 节点之后链接, 执行 set 操作.
如图所示:

一致性 hash 个性

  1. 个性一 – 平衡性

平衡性是指 hash 的后果应该 平均分配到各个节点 , 这样从算法上解决了负载平衡问题
阐明: 如果发现节点中存储的数据负载不均, 则采纳 虚构节点 的形式实现数据的均衡(绝对均衡)

  1. 个性二 – 枯燥性

枯燥性是指在新增或者删减节点时, 不影响零碎失常运行, 因为能够实现 主动的数据迁徙 .
准则: 在进行数据迁徙时 应该尽可能少的扭转原有的数据.(只有产生迁徙的挪动, 迁徙到最近的节点)

  1. 个性三 – 分散性

分散性是指数据应该扩散地寄存在分布式集群中的各个节点(节点本人能够有备份), 不用每个节点都存储所有的数据

退出移动版