Redis有两种方式进行持久化:RDB和AOF
RDB持久化方式
Redis默认是开启RDB持久化方式的,RDB持久化可以通过在客户端执行save或bgsave命令主动进行数据持久化磁盘,或者在配置文件中配置触发bgsave的规则,在满足配置的规则时自动触发bgsave命令进行数据持久化
save是阻塞方式的在持久化过程中不处理客户端的操作请求,save命令只有在需求明确需要数据进行持久化比如关机维护等
在客户端中连续set k1的值为a、b、c,然后执行save命令
可看到控制台日志,进行数据的持久化
此时在配置数据文件的目录下会生成一个.rdb的文件dump.rdb(文件名在配置文件中可配置)
文件内容是以REDIS开头的如下图所示
bgsave是通过调用系统系统函数fork()创建出一个子进程,在子进程中进行数据的持久化,过程中不影响继续处理客户端请求,且在持久化过程中主进程对数据的修改不会影响子进程中数据的时点性。
手动执行bgsave命令
控制台日志输出
在调用fork()创建的子进程会的虚拟内存地址中复制一份虚拟内存地址到物理内存地址的映射,即主进程和子进程虚拟地址的指针指向同一个物理内存地址,主进程发生数据的写操作时使用内核的copy on write机制指向物理内存的一个新的地址,此时子进程执行的还是原来的内存地址。
因为Linux中进程间数据是隔离的,所以主进程对数据的改变对子进程是不可见的,子进程对数据的改变对主进程也是不可见的。
配置文件规则:
60秒发生1000次写请求、300秒发生10次写请求、900秒发生一次写请求都会触发bgsave对内存中的数据进行rdb持久化
save 900 1
save 300 10
save 60 1000
持久化生成的rdb文件名
dbfilename dump.rdb
持久化rdb文件保存的路径
dir /var/lib/redis/6379
RDB方式持久化优缺点:
优点:
1、rdb文件相对较小
2、类似于Java中的序列化方式存储,恢复数据速度相对较快
缺点:
1、不支持拉链,只有一个dump.rdb文件,每次都是覆盖
2、丢失数据相对多些,时点与时点之间窗口的数据容易丢失,如数据未持久化时宕机会丢失上次持久化时点到宕机这个时间窗口内的数据
AOF持久化方式
Redis的每次写操作都会追加到aof文件中,AOF持久化方式默认是关闭的,若想要开启AOF持久化方式则需要修改配置参数appendonly 为 yes,若同时开启了RDB和AOF持久化开机时使用aof文件进行数据的恢复。
开启aof持久化方式
appendonly yes
aof文件名
appendfilename "appendonly.aof"
写操作写入磁盘的配置:
appendfsync always
appendfsync everysec
appendfsync no
always:每次写操作都会执行flush写入磁盘,会丢失一次写操作的数据
everysec:每秒执行一次flush写入磁盘,会丢失不超过一个buffer缓冲区大小的数据,因为一秒内数据若大小超过buffer缓冲区大小,内核会自动写入磁盘
no:不主动执行flush写入磁盘,数据都会写入到内核的buffer缓冲区,缓冲区满了之后由内核执行写入磁盘,会丢失不超过一个buffer缓冲区大小的数据
aof文件重写:
Redis4.0以前的版本执行BGREWRITEAOF命令会删除抵消的命令合并重复的命令,最终生成的也是一个纯指令的日志文件
Redis4.0以后的版本执行BGREWRITEAOF命令会将老的数据以RDB快照的方式写入到aof文件中,后续发生的写操作会以指令的方式追加到aof文件中,aof文件是一个混合体利用的RDB的快和AOF的全量
连续set k1的值为1、2、3
查看aof文件,因为此前没有执行过重写aof文件的操作,所有的命令都是追加的方式写入到aof文件
*2:下面的操作包含两个指令
$6:下一个指令是6个字符
执行BGREWRITEAOF命令执行重写aof文件
再次查看aof文件,此时的aof文件是把以前的全部数据生成rdb快照写入到aof文件中
再次执行写操作
再次查看aof文件,BGREWRITEAOF之后执行的写操作是以命令追加的方式写的aof文件,此时是rdb和aof共存的一个混合体
配置自动执行BGREWRITEAOF命令
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
AOF方式持久化优缺点:
优点:
1、丢失数据相对较少
缺点:
1、aof文件体量无限变大,数据恢复较慢