Redis中提供了两种数据持久化方式,分别是AOF和RDB
1.RDB
RDB存盘有三种触发方式
-
save: 前台阻塞,redis不对外提供服务,一般使用场景:关机维护
-
bgsave: 前台不阻塞,redis继续对外提供服务,fork创建子进程写
fork是Linux系统中的一个api
父子进程是数据隔离的,父子进程对数据的修改是不会影响对方的,在将数据开始写入磁盘时,会copy一个子进程,fork数据的指针而不是数据本身,所以创建速度快,也比较省内存,然后进行写入,此时父进程中的数据被修改了不会影响到写入进程,保证写入磁盘数据的时点正确!时此就能保证redis在备份数据的同时提供服务。
fork时不会直接去复制数据,而是有一个copy on write的内核机制,即写入时复制,比如主进程数据修改了,才会将被修改的这份数据复制过来,这样能保证创建进程速度变快
copyonwrite优点
- 减少分配和复制大量资源时带来的瞬间延时
- 减少不必要的资源分配。比如fork进程时,并不是所有的页面都需要复制,父进程的代码段和只读数据段都不被允许修改,所以无需复制
copyonwrite缺点
- 如果在fork()之后,父子进程都还需要继续进行写操作,那么会产生大量的分页错误(页异常中断page-fault)。但是在Redis中,fork的子进程写完RDB后会关闭,所以不会有这个问题
-
配置文件修改bgsave的规则,这里需要注意的是,参数使用的是save标识,但实际触发的是bgsave,以下三个条件满足任意一个都会触发bgsave
save <seconds> <changes> save 300 10:超过60秒不满足1000次修改时会进入判断,达到300秒或满足10次修改会触发bgsave save 60 10000:达到60秒或10000次以上修改则会触发
RDB有如下弊端
- 不支持拉链,即只有一个dump.rdb文件
- 丢失数据相对较多,因为不是实时记录数据,时点与时点之间窗口数据容易丢失
- 持久化相对慢,因为每次都是全量的
RDB优势
- rdb文件都是二进制文件,所以文件相对小,恢复速度快
- 处理效率(非持久化效率)相对aof来说要高,aof在执行命令后会有存盘操作
2.AOF
AOP开启后,Redis写操作时会触发IO,先把数据写入内核buffer空间,然后再flush到磁盘,频率一共有三种配置
appendfsync always:每一条写的指令都会flush一下内核中的buffer空间,写入磁盘,效率最低但数据完整性最高,除非极端情况在flush时系统断电或异常关闭才会丢失一条数据
appendfsync everysec:每秒会触发一次flush刷buff空间,效率居中,数据丢失取决于这1秒刷新前系统异常关闭时buffer区有多少数据
appendfsync no:不推flush刷新buffer空间,数据満buffer区后内核自动flush,数据丢失是整个buffer区间
AOF优点
- 丢失数据少
- RDB和AOF可以同时开启,如果开启了AOF,则恢复的时候只会使用AOF恢复,在redis4.0以后AOF中包含RDB全量,增量记录新的写操作
AOF弊端
-
体量会无限制变大,恢复会变慢
为了避免AOF文件过大,需要进行rewrite来重整aof文件
rewrite机制:aof里存放了所有的redis 操作指令,当aof文件达到一定条件或者手动
bgrewriteaof
命令都可以触发rewrite,rewrite之后aof文件会保存keys的最后的状态,清除掉之前冗余的,来缩小这个文件。rewrite原理:fork出一个子进程进行rewrite,而父进程继续接受命令,现在的写操作命令都会被额外添加到一个aof_rewrite_buf_blocks缓冲中,当子进程rewrite结束后,父进程收到子进程结束信号,把aof_rewrite_buf_blocks的缓冲写入rewrite后的新文件中,然后切换AOF中的文件fd,即完成了一次rewrite
rewrite自动触发配置
# redis会记录上次写入后的大小,增长比例超过之前的100%,然后对比min-size,达到这个数值就会进行一次review auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
Redis4.0以后AOF文件中会带有一个文件头,文件头格式和RDB文件头相同,目的是支持同时加载RDB格式和AOF格式数据。在Redis4.0之后的版本,如果开启
aof-use-rdb-preamble
,则AOF文件由三个部分组成 (注:该配置在5.0以后都是默认开启的)- 文件头(和RDB文件头格式相同)
- RDB格式的二进制数据段
- AOF格式的文本数据段
此时的AOF是一个混合文件,同时拥有RDB的恢复速度和AOF的数据完整性优势