# 4. Redis的落盘

## 快照

快照是为数不多需要Redis开第二个线程才能解决的命令了, 快照本质上是将内存里的数据dump出来, 而产生的二进制文件.

我们先fork出一个子进程负责做快照, 父进程继续接请求, 在做快照的过程中, 如果(请求)需要做写操作, 就将那一个page复制一份, 然后在副本上修改, 等快照制作完成以后再用副本替代原件.

这种做法叫"Copy On Write"技术, 虽然page的副本产生了冗余, 不过最多也就是两倍冗余, 且Redis里大量数据都是很少访问的冷数据, 因此实际上也没两倍那么多

## AOF落盘

AOF是命令序列, 记录下所有命令, 时间久了命令多了这个AOF文件也会很大, 这个时候将AOF文件恢复到内存里, 等于将所有命令重新执行一遍, 非常的浪费时间. `bgrewriteaof`命令可以压缩AOF文件, 我的理解是将里面的修改命令merge一下.

每次来一条命令就向AOF文件里写一条数据, 效率很低, 因为众所周知磁盘读写效率就是低, 因此内核为aof-fd分配了一个内存缓冲区, 你就往内存里写, 我定期用fsync往文件里刷一次

![](https://3064259429-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC_ucxnzAClkrgsGdFP%2Fsync%2F0aa3465ef4e940925bb6135a5374e08770bb6a9d.png?generation=1597894662207899\&alt=media)

为了减少写盘, 而将磁盘文件映射至内存的的套路, MySQL也在用..而且MySQL用的比他更多

## 快照混合AOF

我们从上一次快照开始做AOF, 一个算全量, 另一个代表最新加上去的增量, 两个组合在一起算落盘, 这种快照+增量 = 全量的套路, etcd再给新节点同步数据的时候也是这么用的
