Redis集群模式

1.redis集群模式

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

redis的集群模式:

  1. 主从复制模式

  2. 哨兵模式

  3. 集群化模式

1.1.主从复制模式

一主多从模式。一个主节点,多个从节点,那么主节点可以负责:读操作,写操作。 从节点只能负责读操作,不能负责写操作。 这样就可以把读的压力从主节点分摊到从节点,以减少主节点的压力。

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

(1)如何搭建主从关系

原则:配从不配主

准备:

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

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

        1.可以在同一台虚拟机开启三个redis服务,区分这三个服务可以按照端口号。

   7001[master]  7002[slave] 7003[slave]

        2.创建文件夹master-slave

         复制三份redis配置文件 redis7001.conf  redis7002.conf    redis7003.conf

        3. 修改三份配置文件的端口号以及rdb文件的名称

4. 根据相应的配置文件开启三个redis服务

5. 客户端连接三个服务。

redis-cli -h 127.0.0.1 -p 7001 
redis-cli -h 127.0.0.1 -p 7002 
redis-cli -h 127.0.0.1 -p 7003 

 6.查看三个redis服务的主从关系

info replication

 7.配置7002和7003为7001的从节点(配从不配主 )

slaveof 主节点的ip  主节点port

 

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

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

 

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

 

1.2 哨兵模式

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

  修改sentinel.conf配置文件

 启动哨兵(正常开发中一主二从节点都需要开启哨兵来监控,这里因为我们是一个虚拟机只需要要配置一个就能监控到监控到三个节点)

redis-sentinel sentinel.conf

测试:

主节点挂掉:

shutdown---redis-cli客户端

需要等待90秒才行 

老大master归位--不在是老大,依旧是7002为主节点。

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。

如何搭建去中心化集群

准备6台redis服务器   创建cluster文件夹 单独放这六个配置文件

 

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

Redis-1 防火墙--6379

bind 0.0.0.0 87行

port 6001 138行

daemonize yes 309行

dbfilename dump6001.rdb  481行

# 打开aof 持久化

appendonly yes 1379行

appendfilename "appendonly6001.aof"   1406行

# 开启集群     默认都是注释的

cluster-enabled yes 1576行   

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

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

# 集群的超时时间

cluster-node-timeout 5000 1590行

 启动上面6个redis服务

redis-server redis6001.conf 
redis-server redis6002.conf 
redis-server redis6003.conf 
redis-server redis6004.conf 
redis-server redis6005.conf 
redis-server redis6006.conf 

 设置主从关系以及槽的分配 --分主从5.0前很复杂,这个是5.0之后的

redis-cli --cluster create --cluster-replicas 1 192.168.19.151:6001 192.168.19.151:6002 192.168.19.151:6003 192.168.19.151:6004 192.168.19.151:6005 192.168.19.151:6006

输入yes

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

测试:客户端连接集群

redis-cli -c -h 192.168.19.151 -p 6001

 可以把写操作均摊到不同的节点上,减轻了单个主节点的压力。

2.java连接redis

redis支持哪些语言可以操作

客户|雷迪斯 (redis.io)icon-default.png?t=M666https://redis.io/docs/clients/

 主要用这三个

 2.1.使用jedis

(1)添加jedis依赖

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

(2)代码测试

连接redis---->必须保证你的redis服务允许远程连接

bind 0.0.0.0 87行

 

@Test
    public void test01(){
        //连接redis---->必须保证你的redis服务允许远程连接
        //该对象中把每个redis命令封装成对应的方法了
        Jedis jedis = new Jedis("192.168.19.151",7777);
        //对于字符串操作的命令
        String s1 = jedis.set("k1", "v1");
        String s2 = jedis.set("k2", "15");
        long l = jedis.incr("k2");
        System.out.println(s1+"  "+s2+"  "+l);
        String setex = jedis.setex("k3",30l,"v3");
        long setnx = jedis.setnx("k4", "v4");
        System.out.println(setex+"  "+setnx);

        //对于hash操作
        jedis.hset("k5","name","张三");
        jedis.hset("k5","age","15");
        Map<String,String> map = new HashMap();
        map.put("name","李四");
        map.put("age","22");
        jedis.hset("k6",map);

        jedis.close();
    }

2.2.使用连接池连接redis

@Test
    public void test02() {
        //创建连接池的配置类
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(20);
        jedisPoolConfig.setMinIdle(5);
        jedisPoolConfig.setMaxWait(Duration.ofMillis(3000));
        //连接redis
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, "192.168.19.151", 7777);

        long start = System.currentTimeMillis();
        for (int i = 1; i < 1000; i++){
            //从jedis连接池获取资源
            Jedis jedis = jedisPool.getResource();
            String ping = jedis.ping();
            jedis.close();//释放资源到池子
        }

        long end = System.currentTimeMillis();

        System.out.println("总耗时:"+(end-start));
    }

如果是ssm框架

<bean id="" class="JedisPoolConfig">

​ <property name="maxIdle" value="20">

</bean>    然后用autowired创建对象

2.3.java连接redis集群模式

 3. springboot整合redis

springboot对redis的操作封装了两个StringRedisTemplate和RedisTemplate类,StringRedisTemplate是RedisTemplate的子类,StringRedisTemplate它只能存储字符串类型,无法存储对象类型。要想用StringRedisTemplate存储对象必须把对象转为json字符串。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值