4.0以前版本
1)每一次向redis写数据,aof持久化文件都会进行一次记录(取决于配置文件的flush数据时间长度),但并不一定会产生dump.rdb
2)rdb持久化方式要比aof频率低一些,也是取决于配置文件中配置的条件,当执行save
(阻塞执行)或bgsave
命令,
就会调用fork()创建子进程并由子进程完成从内存到磁盘的持久化,产生一个rdb文件。
3)当开启了混合体(既开启了rdb又开启了aof持久化),rdb文件的开头会以REDIS字符串开始。
4)rdb文件是一个压缩后的二进制文件,无法直观查看,可以通过 redis-check-rdb dump.rdb
命令来查看rdb文件的一些统计信息。
5)bgrewriteaof
:重写aof持久化文件(合并一些冗余的命令)
4.0以后版本
1)开启aof混合 aof-use-rdb-preamble yes
.
2)每一次向redis写数据,aof持久化文件都会记录。
3)bgrewriteaof
:aof触发重写,此时会将重写前的redis缓存中的数据转成rdb二进制格式存储到aof文件中,减少了CPU的合并等运算过程(即:aof首次触发重写,aof文件会以REDIS字符串开头并且有一些二进制数据)
4)追加:重写后如果再向redis中写数据时,aof文件后面会追加新数据(结构:redis开头+二进制+新的明文数据)
首次重写会将当前的数据直接以二进制压缩的rdb的形式存储到aof文件中。但是此处并不会产生dump.rdb文件,产生rdb文件的时机依然取决于配置文件中配置的rdb策略。
5)这种方式:全量时点数据+增量日志,恢复数据时速度快。
6)如果要生成rdb文件,可以手动执行bgsave。此时会生成当前所有数据的rdb文件。
如果此时再执行bgrewriteaof就会将原来的aof文件(全量时点二进制+增量日志)替换成当前所有数据的rdb格式(aof文件中存入当前时点所有数据的rdb格式的数据),
之后再在后边追加。
比如:
aof文件替换前:
REDIS #¥RBDFGTRY……¥H$#&*(^
set
k1
a
set
k1
b
aof文件替换后:
REDIS #¥RBDFGTRY……¥H$#&(^……#fM&(该文件包含当前所有数据的二进制)
aof自动重写机制
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
首次启动redis的时候,当redis写到64MB,就会触发重写,然后redis会记录当前文件的大小,比如50MB,下次再写到100MB(即50的100%)会触发重写,比如重写后80MB
redis又会记录当前大小,下一次当文件写到160MB时会自动触发重写,以此类推。