Redis07——持久化

103 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

持久化

Redis 为了保证效率, 数据缓存在了内存中, 但是会周期性把更新的数据修改的操作写入文件中, 以保证数据的持久化.

一般使用异步后台进程进行持久化,包括RDBAOF主从同步持久化到其他机器

rdb和aof工作原理与优缺点

image-20220407142951190

RDB流程:默认的持久化方式,将数据以快照的形式保存到硬盘(dump.rdb)。

(1)bgsave命令通知主进程fork出子进程,若存在子进程则直接返回,若没有则主进程会fork子进程

(2)fork子进程时,父进程阻塞

(3)主进程fork完成后继续执行其他命令,子进程存储父进程内存中的数据

(4)子进程完成保存后通知父进程替换旧文件

主进程和子进程会同时操作,若子进程读取数据时父进程要修改数据,会将数据复制一份副本进行修改(操作系统中的写时复制技术),修改完后替换回去。

优点:(1)性能最大化fork 子进程保存数据,主进程不进行IO操作(2)RDB文件紧凑,适合用于备份灾难恢复。(3)RDB在恢复大数据集时比AOF效率高。

缺点:(1)阻塞fork子进程时阻塞父进程(2)数据安全性低,持久化间隔时间内数据可能丢失

image-20220407144844164

AOF:将Redis执行的写命令记录日志文件中,恢复时会重新执行日志文件中的操作;

备份:命令写入缓存区,再刷入AOF文件,刷入时机(每次刷盘、操作系统自动判断、配置每隔1s)

优点:(1)数据更安全默认每隔一秒记录一次(可每次都记录,但影响性能).(2)易解决一致性问题,对日志进行追加,若宕机了可通过 redis-check-aof 修复。(3)自动重写,AOF文件太大时,会在后台进行重写新 AOF 文件包含了恢复当前数据集所需的最小命令集合

缺点:(1)AOF 文件更大,且恢复速度慢。(2)大数据集的数据库启动时启动效率低

AOF重写流程:

(1)bgrewriteaof命令通知主进程fork子进程(正在aof重写则返回,正在bgsave则推迟

(2)fork子进程时,父进程阻塞

(3)主进程fork完成后继续执行,子进程有父进程fork时快照数据了,将最小恢复命令集合写入AOF文件

(4)防止新操作的数据丢失,主进程fork结束后,会将新命令存入rewrite_buf

(5)子进程写入完成后,通知父进程替换旧文件,父进程会将rewrite_buf中的数据写入新AOF文件

rdb-aof混合持久化

Redis4.x,在AOF重写时先BGSAVE命令生成RDB文件放到AOF文件的头部,新命令追加到AOF文件。

如何选择合适的持久化方式

(1)对数据安全性要求高,应该同时使用两种持久化功能。在这种情况下,当 Redis 重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。

(2)数据允许部分丢失,可以只使用RDB持久化

(3)有很多用户都只使用AOF持久化,但并不推荐这种方式,因为定时生成RDB快照非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比AOF恢复的速度要快,使用RDB还可以避免AOF程序的bug