【Redis缓存持久化、主从机制原理与哨兵模式详解】

一、Redis持久化

1.1、Redis持久化—RDB机制

默认情况下,Redis会将内存中的数据保存到dump.rdb的二进制文件中,具体的配置在redis.conf文件中,可设置,如下图示:
在这里插入图片描述
save 参数1 参数2,期表示的含义为:参数1主要是设置其时间,参数2设置的是发生修改的次数,也就是说,要是在指定的时间内发生指定的修改次数,就需要将内存中的数据同步到dump.rdb文件中,除此外,也可以手动的执行save或者bgsave方式生产dump.rdb文件
在这里插入图片描述
在这里插入图片描述

bgsave==>写时复制机制,也就是说,不会阻塞写操作,在生成快照的同时,依然可以往Redis中写数据,bgsave子进程是由主线程生成的,可以共享主线程中的所有内存数据,要是在子进程写数据时,主线程发生写数据操作,那写的这部分数据也会生产一个副本,子进程会把这个副本数据写到rdb文件中去。

1.2、Redis持久化—AOF机制

引入AOF也是基于RDB中存在的缺陷做调整,我们都知道,RDB配置时,需要知道时间和写数据的次数,要是没达到配置的条件,那是不会将数据写到dump.rdb文件中的,那如果是在这个区间,Redis因为不可控因素,宕机了,那这些数据就都丢失了,所以,AOF基于此,设置了三个持久方案,分别如下:
在这里插入图片描述
appendfsync always==> 表示每发生修改,就需要将变更的指令保存到aof文件中
appendfsync everysec==> 表示每过1秒,就需要将变更的指令保存到aof文件中
appendfsync no==> 表示不需要将变更的指令保存到aof文件中
在这里插入图片描述
在这里插入图片描述

AOF重写

在这里插入图片描述

如上图:主要是指暂用内存达到64M(默认)就会发生重写,当然也可手动操作触发重写,指令为bgrewriteaof,重写的目的就是为了将一些冗余的指令合并,如下示例:
在这里插入图片描述

重写前:

在这里插入图片描述

重写后(这里做了配置,混合模式,会将原先的指令转换为二进制文件):
在这里插入图片描述

1.3、Redis持久化—混合持久化方式

就如下图所示,目的是为了在恢复数据时,会快些,但前提是先必须要打开AOF,然后配置aof‐use‐rdb‐preamble为也是yes在这里插入图片描述
在这里插入图片描述

二、Redis主从与哨兵机制

2.1、Redis主从机制设置

Redis主从架构搭建步骤:

  1. 先复制一份redis.conf文件
  2. 将相关配置修改,如下:
    port 6380
    pidfile /var/run/redis_6380.pid
    logfile “6380.log”
    dir /usr/locla/redis-5.0.9/data/6380
  3. 配置主从复制
    replicaof 192.168.118.102 6379 #从6379实例复制数据
    replica-read-only yes #配置为只读
  4. 启动从节点
    redis-server redis.conf
  5. 连接从节点
    redis-cli -p 6380
  6. 测试在主节点上写数据,从节点上是否能及时同步新增或者修改的数据
    a、启动6380重节点时,到主节点6379拉取数据结果:
    在这里插入图片描述
    在这里插入图片描述
    b、在主节点6379上新增或修改时,从节点6380的变化情况:
    在这里插入图片描述
    在这里插入图片描述

Redis主从同步原理分析

配置完Redis的从节点后,无论是否是第一次连接上master,都会发送一个psync请求到master上请求复制数据,master在收到这个psync命令后,会在后台进行数据持久化,通过bgsave生成最新的rdb快照文件,在这个过程中,master仍然可接受新的客户端请求,只是会把这些请求写的数据缓存到内存中,等到持久化完毕之后,会将生成的rdb文件发给从节点,然后再把缓存到内存的数据也发给从节点,主从复制主要有两种方式,如下:

  1. 主从复制(全量复制)流程结构图:
    在这里插入图片描述

  2. 主从复制(部分复制,断点续传)流程图:
    在这里插入图片描述
    注:如果有大量的从节点一直连接在主节点下,会有主从复制风暴的问题,那这种情况我们可以让部分从节点与从节点进行连接同步数据即可

在java程序中测试连接Redis写读数据:

1、导入依赖:

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

2、java代码:

package com.practice.redis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 测试java连接redis服务
 */
public class JedisSingleTest {
    public static void main(String[] args) {

        //配置连接池
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(20);

        jedisPoolConfig.setMaxIdle(10);
        jedisPoolConfig.setMinIdle(5);

        //构建连接池,设置超时时间,这里既是连接超时又是读写超时,从Jedis 2.8开始有区分connectionTimeout和soTimeout的构造函数
        JedisPool jp = new JedisPool(jedisPoolConfig,"192.168.118.102",6379,3000,null);

        Jedis jedis = null;
        try{
            //从redis连接池里拿出一个连接执行命令
            jedis = jp.getResource();
            System.out.println(jedis.set("javaConnectTest","TestJava"));
            System.out.println(jedis.get("javaConnectTest"));
        }catch (Exception e){
            System.out.println("出现异常"+e);
        }
    }
}

3、测试结果截图:
在这里插入图片描述
在这里插入图片描述

2.2、Redis哨兵机制设置

配置Redis哨兵步骤:

  1. 复制sentinel.conf,更名为:sentinel-26379.conf
  2. 更改相关配置如下:
    在这里插入图片描述
    在这里插入图片描述
  3. 启动哨兵服务:
    src/redis‐sentinel sentinel‐26379.conf
  4. 查看哨兵服务详细信息
    在这里插入图片描述

在这里插入图片描述

可以看到Sentinel的info里已经识别出了redis的主从,而且在sentinel的配置文件中会有多出的几行信息:如下图示

在这里插入图片描述

其哨兵结构图示如下:

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值