Redis的分片机制包含对一致性HASH算法的运用

前言:你们都知道redis单台的默认内存大小通常是10M.若是如今须要咱们将1G的数据保存到内存中。这该如何作到呢?好比咱们就用单台redis,可是一味的扩大单台redis内存则直接影响执行的效率,会有一种得不偿失的感受。因而呢,咱们就得采用分片策略实现数据保存,经过多台redis共同为用户提供内存得支持,实现内存扩容,提升执行效率!!java


1.Redis分片机制

1.1 Redis分片搭建准备

1.1.1端口号的划分

首先准备3台redis 分别为6379/7380/6381(6379为默认)node

1.1.2准备分片目录

在redis的根目录中建立分片目录结构--shardsredis

在这里插入图片描述

1.2.3 准备3个Redis的配置文件

复制原有的redis.conf ,以后复制到shards/6379.conf ,6380.conf ,6381.conf算法

1.切换持久化方式--将yes改成no

在这里插入图片描述

2.复制配置文件
[root@localhost redis]# cp redis.conf  shards/6379.conf
[root@localhost redis]# cp redis.conf  shards/6380.conf
[root@localhost redis]# cp redis.conf  shards/6381.conf
3.修改Redis端口号

快速定位port位置 -- 在esc状况下输入:/port
在这里插入图片描述spring

在这里插入图片描述

1.2.4启动3台Redis

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

检查Redis服务,是否正确缓存

ps -ef |grep redis

在这里插入图片描述

1.3Spring整合Redis分片入门案例

须要添加redis依赖,以后再行测试服务器

<!--spring整合redis -->
<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.data</groupId>
	<artifactId>spring-data-redis</artifactId>
</dependency>
public class TestRedis {
	@Test
	public void testShards() {
		List<JedisShardInfo> shards = new ArrayList<>();
		shards.add(new JedisShardInfo("192.168.126.166",6379));
		shards.add(new JedisShardInfo("192.168.126.166",6380));
		shards.add(new JedisShardInfo("192.168.126.166",6381));
		ShardedJedis jedis = new ShardedJedis(shards);
		jedis.set("shards", "测试redis分片机制!!!");
		System.out.println(jedis.get("shards"));
	}

}

1.4一致性HASH算法

1.4.1 redis分片储存问题

问题:用户经过shardsJedis对象管理了3台redis,可是用户在进行赋值操做时,跳转其中一台服务器进行set操做.问题原理是什么
思路: 1.随机存取? 执行效率较低.
          2.hash方式进行存取.分布式

1.4.2一致性hash算法介绍

     一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。 [1] 在移除或者添加一个服务器时,可以尽量小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题 [2] 。
     目的: 解决分布式缓存的存储性问题
     做用: 解决了若是添加/减小节点,则原来的数据尽量保持不变.将变化降到最低.测试

1.4.3一致性HASH原理介绍

常识:设计

  1. hash取值的个数 32位2进制数. 2^32取值区间.
  2. 若是key相同,则hash的结果必然相同.
  3. hash运算的时间复杂度为n 不管计算的数据量多少,运行的速度几乎相同.
1.利用一致性hash算法解决了数据存储问题.

在这里插入图片描述

2.若是节点的数量发生变化.则能够实现动态的数据迁移.

1.5 一致性hash算法特性

1.5.1均衡性

说明:当利用hash一致性算法进行计算时,若是出现了负载不均的现象则开启虚拟节点实现数据的动态平衡.

在这里插入图片描述

1.5.2单调性

单调性是指在新增或者删减节点时,不影响系统正常运行 。

当节点新增/减小时,数据能够实现自动的迁移。

在这里插入图片描述

1.5.3分散性

分散性是指数据应该分散地存放在分布式集群中的各个节点(节点本身能够有备份),没必要每一个节点都存储全部的数据。

在分布式系统中,将数据分散保存到多个节点中,若是未来出现问题.则只影响局部。

俗语:鸡蛋不要放到一个篮子里。

1.6Spring整合Redis分片

1.6.1编辑properties文件

说明:编辑jt-common中的redis.properties配置文件,引入分片设计。

#标识IP地址和端口号信息 IP:PORT
redis.nodes=192.168.126.166:6379,192.168.126.166:6380,192.168.126.166:6381

1.6.2编辑RedisConfig配置类

//引入redis分片  
    @Value("${redis.nodes}")
    private String nodes;   //node,node,node
    
    //将ShardedJedis对象交给Spring容器管理
    @Bean
    public ShardedJedis shardedJedis() {
        List<JedisShardInfo> shards = new ArrayList<>();
        String[] nodeArray = nodes.split(",");
        for (String node : nodeArray) { //node=HOST:PORT
            String host = node.split(":")[0];
            int port = Integer.parseInt(node.split(":")[1]);
            JedisShardInfo info =  new JedisShardInfo(host, port);
            shards.add(info);
        }
        
        return new ShardedJedis(shards);
    }

1.6.3切换AOP对象注入

将原有的jedis对象,切换为redis分片对象.以后访问测试
在这里插入图片描述

开始访问操做,操做成功就妥妥的了
在这里插入图片描述

相关文章
相关标签/搜索