一、RDB持久化
RDB(Redis数据备份文件),也被叫做redis数据快照,就是把内存中的所有数据记录到磁盘中,当redis实例故障重启后,就会读取快照文件,恢复数据
主动备份

自动备份
在配置文件redis.config中可以配置

save 900 1 表示为900内秒至少有1个key被修改,则执行bgsave
save 300 10 表示为300秒内至少有10个key被修改,则执行bgsave
RDB的执行原理
bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件
什么是fork操作?
fork操作会完全复制一个与当前进程一样的子进程,包括内存数据。这意味着子进程可以访问父进程中的所有数据,从而不会影响父进程的运行过程。
fork操作对主进程几乎没有阻塞,但是在开启新进程的时候会参数纳秒级阻塞,忽略不计
原理
在linux中,进程无法直接访问内存数据,所有linux会给主进程分配一个虚拟内存,主进程只能操作虚拟内存,操作系统中会有一个虚拟内存跟物理内存的映射表,就是页表

主进程操作虚拟内存,基于页表的映射,就可以对物理内存进行读和写操作

主进程fork一个子进程后,会将页表数据拷贝给子进程,此时,子进程就有跟主进程一样的映射关系,子进程操作自己的虚拟内存的时候,因为映射关系是一样的,所以会操作跟主进程一样的物理内存区域,这样就实现了主进程跟子进程内存的共享

然后,子进程将读到的内存数据写入到磁盘当中,写入新的RDB文件,替换旧的RDB文件

注意点:子进程在写RDB文件的时候,主进程如果同时在写数据,可能会发生数据冲突,出现脏数据
什么是“脏”数据?
通俗来说,它是因数据重复录入、共同处理等不规范操作而产生的混乱、无效数据。这些数据不能为企业带来价值,反而会占据存储空间,浪费企业的资源。因此,这些数据被称为“脏”数据,不仅没有价值,还会“污染”其他的数据。
为了避免脏数据的产生,fork会采用copy-on-write技术
copy-on-write技术
- 当主进程执行读操作时,访问共享内存。
- 当主进程执行写操作时,则会拷贝一份数据,执行写操作。
在fork时,会将共享的内存标记为read-only,在这个read-only区域内是一个只读模式

如果主进程要进行写操作,会先将read-only拷贝一份,再去完成写操作,如果拷贝了一份,后面主进程的读操作也是在新拷贝的数据上进行

二、AOF持久化
AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。

会记录所有redis的写操作
AOF默认关闭,需要通过配置文件进行打开

AOF的命令记录频率也可以通过配置文件来更改

一般使用 everysec,丢失的数据最少
缺点:因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置

RDB和AOF对比
RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。


1731

被折叠的 条评论
为什么被折叠?



