xiaohanliang
Database
Database
  • review
  • MySQL
    • 0. 索引就是树吗
    • 1. 索引是怎么发挥作用的
    • 2. 聊聊怎么估时间
    • 3. 主键玄学
    • 4. 事务的执行过程@ACD
    • 5. MVCC就是用undolog回退
    • 6. 事务如何彼此隔离@I
    • 7. 如何人为的制造死锁
    • 8. 引擎是干什么的
    • 9. 主从复制怎么做到的
    • 10. 寻找同步起始点GTID
    • 11. 预解析Statement
  • Redis
    • 0. Hash@数据结构
    • 1. ZSet@数据结构
    • 2. 场景与玩法@数据结构
    • 3. 可能的风险点
    • 4. Redis的落盘
    • 5. 关于效率的讨论
    • 6. 主从模式@集群化
    • 7. [WIP]Proxy实现@集群化
    • 8. 标准玩法@集群化
  • KV/Distributed
    • 0. 面临的问题
    • 1.Raft@原理
    • 2. LSM@原理
    • 3. [WIP]分布式事务@原理
Powered by GitBook
On this page
  • 快照
  • AOF落盘
  • 快照混合AOF

Was this helpful?

  1. Redis

4. Redis的落盘

Previous3. 可能的风险点Next5. 关于效率的讨论

Last updated 4 years ago

Was this helpful?

快照

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

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

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

AOF落盘

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

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

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

快照混合AOF

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