Reids的两种持久化存储的形式
1 RDB内存快照与AOF增量日志
1.1 RDB(Redis Data Base)内存快照
RDB内存快照:指的是在指定的时间间隔内将内存中的数据集以快照的形式写进磁盘,RDB
是内存快照(内存数据的二进制序列化形式)的方式持久化,每次都是从Redis中生存一个快照进行数据的全量备份。
1.1.1 优点
- 存储紧凑,节省内存空间
- 恢复速度非常快
- 适合全量备份、全量复制的场景,经常用于灾难恢复(对数据的完整性和一致性要求相对较低的场合)
1.1.2 缺点
- 容易丢失数据,容易丢失两次快照之间的Redis服务器中的变化数据
- RDB是通过fork子进程对内存快照进行全量备份,是一个重量级操作,频繁执行成本高。
- fork子进程,虽然内存共享,但是如果备份的时候,内存被修改,最大可能膨胀到2倍大小。
1.2 AOF(Append Only File)增量日志
AOF增量日志:是吧所以对内存进行修改的指令(写操作)以独立日志的方式进行记录,重启时通过执行AOF文件中的Redis命令来恢复数据。AOF能够解决数据持久化实时性的问题,是现在Redis持久化机制中主流的持久化方案
1.2.1 优点
- 数据的备份更加完整,丢失数据的概率更低,时适合对数据完整性要求高的场景。
- 日志文件刻度,AOF可操作性更强,可通过操作日志文件进行修复
1.2.2 缺点
- AOF日志记录在长期运行中逐渐庞大,恢复起来非常耗时,需要定时对AOF日志进行瘦身处理
- 恢复备份速度比较慢
- 同步写操作频繁会带来性能压力
2 Fork
在RDB持久化过程中,主进程会fork一个子进程来负责RDB的备份。
- Linux操作系统中的程序,fork会产生一个和父进程完全相同的子进程。子进程与父进程所有的数据均一致,但是子进程是一个全新的进程,与原进程是父子进程关系
- 出于效率考虑,Linux操作系统中使用COW(Copy On Write)写时复制机制,fork子进程一般情况下与父进程共同使用一段物理内存,只有在进程空间中的内存发生修改时,内存空间才会复制一份出来。
参考:Redis持久化AOF与RDB全面解析(详细看原文)