文章目录
一、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主从架构搭建步骤:
- 先复制一份redis.conf文件
- 将相关配置修改,如下:
port 6380
pidfile /var/run/redis_6380.pid
logfile “6380.log”
dir /usr/locla/redis-5.0.9/data/6380 - 配置主从复制
replicaof 192.168.118.102 6379 #从6379实例复制数据
replica-read-only yes #配置为只读 - 启动从节点
redis-server redis.conf - 连接从节点
redis-cli -p 6380 - 测试在主节点上写数据,从节点上是否能及时同步新增或者修改的数据
a、启动6380重节点时,到主节点6379拉取数据结果:
b、在主节点6379上新增或修改时,从节点6380的变化情况:
Redis主从同步原理分析
配置完Redis的从节点后,无论是否是第一次连接上master,都会发送一个psync请求到master上请求复制数据,master在收到这个psync命令后,会在后台进行数据持久化,通过bgsave生成最新的rdb快照文件,在这个过程中,master仍然可接受新的客户端请求,只是会把这些请求写的数据缓存到内存中,等到持久化完毕之后,会将生成的rdb文件发给从节点,然后再把缓存到内存的数据也发给从节点,主从复制主要有两种方式,如下:
-
主从复制(全量复制)流程结构图:
-
主从复制(部分复制,断点续传)流程图:
注:如果有大量的从节点一直连接在主节点下,会有主从复制风暴的问题,那这种情况我们可以让部分从节点与从节点进行连接同步数据即可
在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哨兵步骤:
- 复制sentinel.conf,更名为:sentinel-26379.conf
- 更改相关配置如下:
- 启动哨兵服务:
src/redis‐sentinel sentinel‐26379.conf - 查看哨兵服务详细信息
可以看到Sentinel的info里已经识别出了redis的主从,而且在sentinel的配置文件中会有多出的几行信息:如下图示
其哨兵结构图示如下: