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

Stella981
• 阅读 554

前言:大家都知道redis单台的默认内存大小一般是10M.如果现在需要我们将1G的数据保存到内存中。这该如何做到呢?比如我们就用单台redis,但是一味的扩大单台redis内存则直接影响执行的效率,会有一种得不偿失的感觉。于是呢,我们就得采用分片策略实现数据保存,通过多台redis共同为用户提供内存得支持,实现内存扩容,提高执行效率!!


1.Redis分片机制

1.1 Redis分片搭建准备

1.1.1端口号的划分

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

1.1.2准备分片目录

在redis的根目录中创建分片目录结构--shards

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

1.2.3 准备3个Redis的配置文件

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

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

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

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
Redis的分片机制包含对一致性HASH算法的运用

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

1.2.4启动3台Redis

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

检查Redis服务,是否正确

ps -ef |grep redis

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

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算法解决了数据存储问题.

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

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

2.如果节点的数量发生变化.则可以实现动态的数据迁移.

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

1.5 一致性hash算法特性

1.5.1均衡性

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

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

1.5.2单调性

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

当节点新增/减少时,数据可以实现自动的迁移。

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

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分片对象.之后访问测试
Redis的分片机制包含对一致性HASH算法的运用

开始访问操作,操作成功就妥妥的了
Redis的分片机制包含对一致性HASH算法的运用

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Redis高可用哨兵机制及SpringBoot整合哨兵
前言:在前面讲到了Redis分片机制可实现内存数据的扩容来提高执行速率Redis分片机制(https://my.oschina.net/u/4115134/blog/3207715),可是Redis分片依旧有一些问题,如果redis分片的节点如果有一个服务器宕机,则直接影响用户的使用.Redis分片机制没有实现高可用功能(HA)。我所使
可莉 可莉
2年前
051. Redis 持久化机制
1\.持久化介绍Redis的数据存在在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。!image20200511165351687(https://oscimg.oschina.net/os
Stella981 Stella981
2年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
2年前
Redis内存淘汰机制及过期Key处理
  “天长地久有时尽,此恨绵绵无绝期。”好诗!好诗啊!即使是天长地久,也总会有尽头,那么,Redis的内存是不是也会有时尽呢?答案是肯定的。那么,当Redis的内存满了以后,再来新的请求,我们该怎么办呢?这时候,大家就应该来了解Redis的内存淘汰策略了,了解了相关的知识点后,就能明白“Redis内存有时尽”后,会发生些什么。Redis内存淘汰机制
Stella981 Stella981
2年前
051. Redis 持久化机制
1\.持久化介绍Redis的数据存在在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。!image20200511165351687(https://oscimg.oschina.net/os
Stella981 Stella981
2年前
Redis主从、哨兵
之前安装了redis,但是单节点redis不可靠,现在搭建redis主从,提高可用性。一、搭建一主二从  redis主从其实是读写分离,主节点写数据,从节点读数据。  1、准备三台redis机器。redis的密码需要一致,否则主从切换时会有问题。  2、选择两台,作为从机,编辑redis核心配置文件。vim/us
Easter79 Easter79
2年前
Spring该如何整合Redis集群
前言:在上一文中,我讲到了如何搭建redis集群让集群拥有分片的数据内存的扩容和哨兵的高可用(https://my.oschina.net/u/4115134/blog/3210013)。今天给大家讲解一下Spring如何整合Redis集群在这里首先给大家说一说分片和哨兵的特点:1.分片的主要的作