应用场景
当咱们须要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
- 常见hash是8位16进制数
- 16进制数取值:0-9 A-F 共16个数
- hash的取值范畴:00000000-FFFFFFFF(00000000与FFFFFFFFF是同一个数)
- 00000000-FFFFFFFF共有2^32个数
- 对雷同的数据取hash值雷同
一致性hash阐明
步骤:
1.首先计算node节点hash值
2.将用户的key进行hash计算,之后依照顺时针的方向找到最近的node节点之后链接,执行set操作.
如图所示:
一致性hash个性
- 个性一--平衡性
平衡性是指hash的后果应该平均分配到各个节点,这样从算法上解决了负载平衡问题
阐明: 如果发现节点中存储的数据负载不均,则采纳虚构节点的形式实现数据的均衡(绝对均衡)
- 个性二--枯燥性
枯燥性是指在新增或者删减节点时,不影响零碎失常运行,因为能够实现主动的数据迁徙.
准则: 在进行数据迁徙时 应该尽可能少的扭转原有的数据.(只有产生迁徙的挪动,迁徙到最近的节点)
- 个性三--分散性
分散性是指数据应该扩散地寄存在分布式集群中的各个节点(节点本人能够有备份),不用每个节点都存储所有的数据