一、什么是持久化?
持久化:是将程序数据在持久状态和瞬时状态转换的机制。通俗的讲,就是将瞬时数据(比如内存中的数据,不能永久保存)转化为持久数据(比如转化为数据库或者磁盘文件中,能够长期保存)
JDBC就是一种持久化机制,文件IO也是一种持久化机制
二、为什么需要持久化?
redis数据存储在内存中,内存断电即失。所以我们需要将redis中的数据进行持久化,这样即使重启服务器,我们的数据依然存在
三、redis持久化策略
redis提供了两种持久化策略:RDB、AOF
四、RDB持久化
概念:RDB持久化是将当前进程中的数据按照一定规则生成快照保存到硬盘,保存的文件后缀是.rdb;当redis重启时,可读取快照文件进行数据恢复
五、RDB持久化
手动触发
save命令和bgsave命令都可以生成RDB文件
-
save命令生成RDB文件
1、向redis中set k1 v1,重启redis,get k1看看能不能获取到
结论:为进行持久化操作,重启redis后,数据丢失
2、重新set k1 v1后调用save命令进行持久化操作,然后重启redis,再次get k1看看能不能取到
结论:能够成功取到K1,redis中的数据被持久化到dump.rdb文件中,重启redis时,redis会读取rdb文件进行数据回复
注意:
save:该命令会阻塞redis服务器进程,直到RDB文件创建完毕为止,在redis服务器阻塞期间,服务器不能处理任何命令请求 bgsave:该命令执行过程中,只有fork子进程时会阻塞服务器,而对于save命令,整个过程都会阻塞服务器,线上环境要杜绝使用save命令 -
bgsave命令生成RDB文件
- 流程图
- 步骤
-
redis父进程首先判断当前是否在执行save或bgsave,如果有直接返回。
-
父进程fork创建子进程,这个过程中发进程是阻塞的,redis不能执行来自客户端的任何命令
-
父进程fork后,bgsave命令正确返回不在阻塞父进程,这是父进程可以响应其它命令
-
子进程创建rdb文件,根据父进程内存快照生成临时快照,完成后对原有文件执行源自替换。
-
子进程发送信号给父进程表示完成,父进程更新统计信息
-
- 流程图
自动触发
自动触发一般都是在redis.conf配置文件中进行配置
命令解释:当900s期间内,如果检测到redis数据发生了至少1次变化,则执行bgsave命令生成rdb文件
-
配置总结
参数解析:
save m n:bgsave自动触发的条件;如果没有save m n配置,相当于自动的RDB持久化关闭,不过此时仍可以通过其他方式触发
stop-writes-on-bgsave-error yes:当bgsave出现错误时,Redis是否停止执行写命令;设置为yes,则当硬盘出现问题时,可以及时发现,避免数据的大量丢失;设置为no,则Redis无视bgsave的错误继续执行写命令,当对Redis服务器的系统(尤其是硬盘)使用了监控时,该选项考虑设置为no
rdbcompression yes:是否开启RDB文件压缩
rdbchecksum yes:是否开启RDB文件的校验,在写入文件和读取文件时都起作用;关闭checksum在写入文件和启动文件时大约能带来10%的性能提升,但是数据损坏时无法发现
dbfilename dump.rdb:RDB文件名
dir ./:RDB文件和AOF文件所在目录
RDB和AOF对比
优势:
1.RDB是一个非常紧凑的文件,保存了redis在某个节点上的数据集,这种文件非常适用于进行备份和灾难恢复
2.生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作
3.RDB在恢复大数据集时的速度比AOF的恢复速度要快
劣势:
1.RDB方式数据没办法做到实时持久化,因为bgsave每次运行都要fork操作创建子进程,属于重量级操作,如果不采用压缩算法,频繁执行成本过高(影响性能)
2.RDB文件使用特定的二进制格式保存,redis版本演进过程中有多个格式的RDB版本,存在老版本redis服务无法兼容新版RDB格式的问题
3.在一定间隔时间做一次备份,所以如果redis意外宕机,就会丢失最后一次快照后的所有修改