持久化:将内存中的数据保存在硬盘上
序列化:将对象保存在硬盘上

redis的持久是通过两种方式完成的:
RDB快照
aof日志

一.RDB快照

Rdb快照的配置选项:

save 900 1 // 900内,有1条写入,则产生快照
save 300 1000 // 如果300秒内有1000次写入,则产生快照
save 60 10000 // 如果60秒内有10000次写入,则产生快照
    (这3个选项都屏蔽,则rdb禁用)

和持久化相关的redis配置:

stop-writes-on-bgsave-error yes // 后台备份进程出错时,主进程停不停止写入?
rdbcompression yes // 导出的rdb文件是否压缩
Rdbchecksum yes // 导入rbd恢复时数据时,要不要检验rdb的完整性
dbfilename dump.rdb //导出来的rdb文件名
dir ./ //rdb的放置路径

二.aof日志

AOF的配置

appendonly no # 是否打开 aof日志功能
appendfsync always # 每1个命令,都立即同步到aof. 安全,速度慢
appendfsync everysec # 折衷方案,每秒写1次
appendfsync no # 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到 aof. 同步频率低,速度快。
no-appendfsync-on-rewrite yes: # 正在导出rdb快照的过程中,要不要停止同步aof
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写

三.两种机制的比较

RDB持久化

AOF持久化

全量备份,一次保存整个数据库

增量备份,一次保存一个修改数据库的命令

保存的间隔较长

保存的间隔默认一秒

数据还原速度快

数据还原速度一般

save会阻塞,但bgsave或者自动不会阻塞

无论是平时还是AOF重写,都不会阻塞

更适合数据备份,默认开启

更适合用来保存数据,和一般SQL持久化方式一样,默认关闭

启动优先级 : 低

启动优先级 : 高

体积 : 小

体积 : 大

恢复速度 : 快

恢复速度 : 慢

数据安全性 : 丢数据

数据安全性 : 根据策略决定

轻重 : 重

轻重: 轻

四.redis持久化相关的问题

1、在dump rdb过程中,aof如果停止同步,会不会丢失?

答: 不会,所有的操作缓存在内存的队列里, dump完成后,统一操作.

2、aof重写是指什么?

答: aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里。以解决 aof日志过大的问题。

3、如果rdb文件,和aof文件都存在,优先用谁来恢复数据?

答: 在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件完整。

4、 2种是否可以同时用?

答: 可以,而且推荐这么做

5、恢复时rdb和aof哪个恢复的快

答: rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行

五.Redis主从复制(集群)

1、集群的作用:

主从备份----防止主机宕机
读写分离----分担master 的任务
任务分离----如从服分别分担备份工作与计算工作

集群布局1:

redis 持久化配置解析 redis如何配置持久化_redis

集群布局2:

redis 持久化配置解析 redis如何配置持久化_数据_02


第二种方案有一个好处:master宕机后,可以直接切换到slave1

2、主从通信过程

redis 持久化配置解析 redis如何配置持久化_redis 持久化配置解析_03


步骤:

1.salve会自动的发送一个同步的指令并连接master。

2.master收到同步指令后,会dump rdb(内存镜像),并传送给slave,slave拿到整块的内存镜像塞到自己的内存中。

3.如果在dump rdb的过程中,master中还有新的操作命令对其操作,那么这些命令将会缓存到aof日志中,dump结束后就统一发送给slave。

4.此后,如果master再改变,就由一个叫:replicationFeedSlaves的进程去维护之间数据的同步。

3、主从配置

主服务器:
rdb禁用

#save 900 1
#save 300 10
#save 60 1000

aof打开

appendonly yes

从服务器:

设置端口

port 6380

有一台启用rdb
两台都禁用aof
设置slave-of

slaveof localhost 6379

redis-server redis.windows.conf --maxheap 200m
redis-server redis.windows6380.conf --maxheap 200m
redis-server redis.windows6381.conf --maxheap 200m

启动客户端:

redis-cli 
redis-cli -p 6380
redis-cli -p 6381