4. Redis的落盘
Last updated
Was this helpful?
Last updated
Was this helpful?
快照是为数不多需要Redis开第二个线程才能解决的命令了, 快照本质上是将内存里的数据dump出来, 而产生的二进制文件.
我们先fork出一个子进程负责做快照, 父进程继续接请求, 在做快照的过程中, 如果(请求)需要做写操作, 就将那一个page复制一份, 然后在副本上修改, 等快照制作完成以后再用副本替代原件.
这种做法叫"Copy On Write"技术, 虽然page的副本产生了冗余, 不过最多也就是两倍冗余, 且Redis里大量数据都是很少访问的冷数据, 因此实际上也没两倍那么多
AOF是命令序列, 记录下所有命令, 时间久了命令多了这个AOF文件也会很大, 这个时候将AOF文件恢复到内存里, 等于将所有命令重新执行一遍, 非常的浪费时间. bgrewriteaof
命令可以压缩AOF文件, 我的理解是将里面的修改命令merge一下.
每次来一条命令就向AOF文件里写一条数据, 效率很低, 因为众所周知磁盘读写效率就是低, 因此内核为aof-fd分配了一个内存缓冲区, 你就往内存里写, 我定期用fsync往文件里刷一次
为了减少写盘, 而将磁盘文件映射至内存的的套路, MySQL也在用..而且MySQL用的比他更多
我们从上一次快照开始做AOF, 一个算全量, 另一个代表最新加上去的增量, 两个组合在一起算落盘, 这种快照+增量 = 全量的套路, etcd再给新节点同步数据的时候也是这么用的