持久化:可以理解为mit6.824教的主从备份机制,状态转移对应RDB,复制状态机对应AOF,RDB是全部数据的二进制快照文件,AOF是文本追加的日志。RDB拷贝全部数据慢,是分钟级别的恢复机制但恢复更快,AOF通常设置1秒保存一次。官方推荐默认使用RDB,但AOF与RDB同时开启仅使用AOF
- RDB触发:
1、主动执行save(阻塞)或bgsave(非阻塞)。
2、达到阙值。
3、关闭redis。 - RDB流程:
1、folk一个子进程。
2、数据写到临时RDB文件。
3、新RDB文件替换旧文件 - RDB持久化时通过写时复制实现可修改。修改时再复制内存,即持久化的是修改前内存。
- AOF需要修改conf开启,三种模式appendfsync always、appendfsync everysec、appendfsync no。
- AOF触发:
1、beforesleep。
2、周期函数serveCron。
3、关闭服务器。
4、关闭AOF。 - AOF流程:
1、写入AOF缓存aof_buf。
2、aof_buf复制到磁盘缓冲区。
3、调用flush系统调用存盘。 - AOF重写:
1、AOF合并新旧指令。
2、新写入数据写入AOF缓存和AOF重写缓存。
3、AOF重写缓存追加到新AOF。
4、新AOF替代旧AOF。 - AOF重写触发:超过64M且比上次重写数据大一倍。
- AOF混合持久化:将RDB与AOF缓冲结合为AOF文件,此时AOF不是单纯的文本了(开头有REDIS),而是二进制RDB+指令文本。可降低重写性能损耗。降低AOF存储空间。
- 合并优化思路:重复指令->通过RDB最终状态推导出最新指令实现合并->直接用RDB又快又少
- 7.0 MP-AOF:将混合AOF分为BASE AOF文件(RDB快照),和INCR AOF redis追加命令日志文件。由manifest清单管理一组AOF文件,旧AOF被manifest异步删除,优化了新指令要写入两个缓冲和AOF重写缓存还要通过通道加到AOF文件中。
- MP-AOF优化思路:两个缓冲对应原AOF两个部分,混合AOF两部分拆开后则只需要一个缓存,这个缓存直接写INCR AOF。