对比介绍
前置说明
fork函数说明
指克隆父进程,复制进程的所有数据(比如地址,指针等,但不是内存中的数据)
故在redis fork时,时间有长有短,但总时间都不会太长。
时间有长有短:父进程的保存的内存对应的地址(指针)数量不同
总时间都不会太长:因为不是复制内存数据,总数据量不会太大
fork()函数返回值有三种情况
等于0,则代表当前进程是子进程
大于0,则代表当前进程是父进程,值为父进程的pid
等于-1,则代表fork失败
对比说明
RDB:二进制文件,压缩保存,内存快照,原子替换
AOF:append-Only,写操作命令以文件形式追加,可读可编辑,文件持续增加需要rewrite
| \ | RDB | AOF |
|---|---|---|
| 启动优先级 | 低 | 高 |
| 体积 | 小 | 大 |
| 恢复速度 | 快 | 慢 |
| 数据安全性 | 丢失若干时间内的数据 | 根据策略决定 |
执行顺序
持久化时,fork子进程时,如果子进程正在被占用,则立即返回,如果未占用,则创建并进行持久化。
RDB
优缺点说明
优点:
体积更小:紧凑二进制文件压缩,比AOF文件小
恢复更快:内存数据的快照,不用重新读写
性能更好:父进制fork子进制操作,父进制不参与磁盘IO,保证机器性能
缺点:
不同版本rdb快照文件有的不兼容
快照保存周期间隔时间长
内存数据过大时,fork时耗时长
配置说明
触发时机:
bgsave
正常关闭
时间与写综合配置
save 900 1 # 表示 900s 内如果至少有 1 个 key 的值变化,则触发RDBsave 300 10 # 表示 300s 内如果至少有 10 个 key 的值变化,则触发RDBsave 60 10000 # 表示 60s内如果至少有 10000 个 key 的值变化,则触发RDB
工作原理

注:写时复制(copy-on-write)时,物理内存中复制的是一个内存页(4K),而不是一条数据
AOF
优缺点说明
优点:
文件追加方式:追加指令到文件末尾,写操作快
fsync策略默认1秒(no/always/everysec 默认),最多丢失1秒数据
文件过大时,触发rewrite,处理成可恢复时当前指定最小集合,并原子替换, rewrite时不是基于旧的指定进行合并,而是基于当前内存数据进行merge,健壮性提高
中途down机后,可以通过check脚本自动恢复到最近成功的指令,减少丢失的数据量
文件可读性好,可人工编辑修改
缺点:与RDB正好相反
体积较大:指令内容追加文件,内容持续增加,rewrite后减小
恢复较慢:aof文件中的指令回溯
性能较差:fsync时消耗性能
配置说明
appendonly no #是否使用AOF持久化appendfsync everysec #多久执行一次将写入内容同步到硬盘上no-appendfsync-on-rewrite no #对AOF进行压缩的时候能否执行同步操作auto-aof-rewrite-percentage 100 # 多久执行一次AOF压缩auto-aof-rewrite-min-size 64mb # 多久执行一次AOF压缩dir ./ #AOF所保存的位置
注:如果aof文件超过配置的百分比大小后,但没有超过auto-aof-rewrite-min-size
,也不会rewrite
三种fsync策略
# appendfsync alwaysappendfsync everysec # 默认# appendfsync no
工作原理
不需要rewrite时

需要rewrite时
以 appendfsync everysec
策略为例

恢复流程
说明
同时开启,优先使用aof恢复,如果aof文件不存在,则创建新的文件,如果文件损坏,则自动修复,少量损坏可恢复到最近正常的位置,大量则不恢复,内存为空





