redis集群模式

1. redis集群模式主要形式

redis单机版,出现单机故障后,导致redis无法使用,如果程序使用redis,间接导致程序出错。

redis的集群模式:

(1)主从复制模式

(2)哨兵模式

(3)集群化模式

3.1 主从复制模式

一主多从模式。一个主节点,多个从节点,主节点可以负责:读操作,写操作。 从节点只能负责读操作,不能负责写操作。

可以把读的压力从主节点分摊到从节点,以减少主节点的压力。

当主节点执行完写命令,会把数据同步到从节点。

搭建主从关系步骤:(在一台电脑上模拟搭建的前提下)

原则:配从不配主。

准备: 一主二从-----3台----开三个虚拟机--为了节省虚拟机,在一台主机开启三个redis服务。

7001主节点          7002和7003作为从节点

(1)修改端口号以及rdb文件的名称.

(2)启动redis服务 ps -ef | grep redis

(3)进入三个redis服务的客户端  

(4)查看三个redis服务的主从关系

master 为主 此时三个服务端都是主 

 

 (5)配置7002和7003为7001的从节点

在从节点服务器那里输入命令 slaveof  主节点服务器

 

通过实验: 我们在主节点上执行set k1 v1 可以发现从节点也存在该数据.证明同步到从节点。

可以看出主节点可以读和写。但是从节点只能读。

思考: 1.  如果主节点挂了,从节点会不会上位?    不会
     2.  如果增加一个新的从节点,新从节点会不会把之前的数据同步过来。 会

1.2 哨兵模式

由于主从模式,主节点单机后,从节点不会自动上位。 增加一个哨兵服务,该哨兵时刻监控master,如果master挂了,哨兵会在从节点中选举一位为主节点【哨兵投票机制】。

在sentinel.conf中修改配置  

启动哨兵       

redis-sentinel sentinel.conf

 

测试:

主节点挂掉:

shutdown---redis-cli客户端

 思考:老大归位--不再是老大。

1.3 集群化模式

不管上面的主从还是哨兵模式,都无法解决单节点写操作的问题。如果这时写操作的并发比较高。这是可以实验集群化模式【去中心化模式】

原理:

redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个整数结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

当你往Redis Cluster中加入一个Key时,会根据crc16(key) mod 16384计算这个key应该分布到哪个hash slot中,一个hash slot中会有很多key和value。可以理解成表的分区,使用单节点时的redis时只有一个表,所有的key都放在这个表里;改用Redis Cluster以后会自动为你生成16384个分区表,你insert数据时会根据上面的简单算法来决定你的key应该存在哪个分区,每个分区里有很多key。

 搭建:

三主三从:
   6001 6002 6003 主节点
   6004 6005 6006 从节点

在每个节点的conf文件中需要修改以下配置

注意:修改配置的同时也需要删除前面的隐藏符

Redis-1 防火墙--6379

bind 0.0.0.0 69行

port 6001 92行

daemonize yes 136行

dbfilename dump6001.rdb

# 打开aof 持久化

appendonly yes 700行

appendonly appendonly6001.aof

# 开启集群

cluster-enabled yes 833行

# 集群的配置文件,该文件自动生成

cluster-config-file nodes-6001.conf 841行

# 集群的超时时间

cluster-node-timeout 15000 847行

 启动这六个redis服务 在集群模式下 服务器后面会跟上 【cluster】字眼

 分配槽 

redis-cli --cluster create --cluster-replicas 1 192.168.118.110:7000
 192.168.118.110:7001 192.168.118.110:7002 192.168.118.111:7003
 192.168.118.111:7004 192.168.118.111:7005

 注意: 一定要保证每个节点都没有数据。

测试:

redis-cli -c -h 192.168.223.155 -p 6001

由此可以知道, 集群模式把写操作均摊到不同的节点上,减轻了单个主节点的压力。

2.1 使用jedis

(1)添加jedis依赖

   <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.8.0</version>

(2)代码测试

@Test
    public void test1(){
//连接redis--->必须保证你的redis服务运行远程连接。
        //该对象中把每个redis命令封装成对应的方法了。
        Jedis jedis =new Jedis("192.168.88.155",6379);
//对于字符串的操作
        jedis.set("k12","v12");
        jedis.mset("k13","v13","k14","v14","k15","v15");
//对于hash的操作 可以在一个key中存入多个数据
        jedis.hset("k16","name","wmd");
        jedis.hset("k16","age","18");
//也可以把所有的数据存在map中,再存到hash中
        Map<String,String> map = new HashMap<>();
        map.put("name","www");
        map.put("age","20");
        jedis.hset("k17",map);
    }

2.2 使用连接池连接redis

 @Test
    public void test2(){
        //创建连接池的配置类
        JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(20);//最大空闲数
        jedisPoolConfig.setMinIdle(5);//最小空闲数
        jedisPoolConfig.setMaxWait(Duration.ofMillis(3000));//最长等待时间
        JedisPool jedisPool=new JedisPool(jedisPoolConfig,"192.168.88.155",6379);
        long start = System.currentTimeMillis();
        for(int i=0;i<1000;i++){
            //从jedis连接池获取资源
            Jedis resource = jedisPool.getResource();
            String ping = resource.ping();
            resource.close();//是否资源到池子
        }

        long end = System.currentTimeMillis();
        System.out.println(end-start);//计算总耗时时间

    }

2.3 java连接redis集群模式

@Test
    public void test3(){
        Set<HostAndPort> nodes = new HashSet<>();
        nodes.add(new HostAndPort("192.168.88.155",6001));
        nodes.add(new HostAndPort("192.168.88.155",6002));
        nodes.add(new HostAndPort("192.168.88.155",6003));
        nodes.add(new HostAndPort("192.168.88.155",6004));
        nodes.add(new HostAndPort("192.168.88.155",6005));
        nodes.add(new HostAndPort("192.168.88.155",6006));
        JedisCluster jedisCluster = new JedisCluster(nodes);
        jedisCluster.set("k5","张亮梁");
        jedisCluster.close();
    }

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值