1. 问题
1) RDB为redis的一个全量的内存快照,但是每次都需要全量,耗时很长,如何实现增量的持久化?
2)类似于Mysql的bin log日志,Row格式存储的是数据,Statement存储的是执行的命令语句,redis有没有?
2. AOF流程
1) 服务器每次执行完一个写命令,会以协议格式将执行的写命令追加到aof_buf缓冲区的末尾;
2) 根据一定的策略,将缓冲区的数据写入aof文件
AOF流程伪代码:
def eventLoop(): while True: # 处理文件事件,接收命令请求以及发送命令回复 # 处理命令请求时可能会有新内容被追加到 aof_buf 缓冲区中 processFileEvents() # 处理时间事件 processTimeEvents() # 考虑是否要将 aof_buf 中的内容写入和保存到 AOF 文件里面 flushAppendOnlyFile()
flushAppendOnlyFile函数的行为由服务器配置的appendfsync选项的值来决定。
appendfsync有三种值,分别为always(直接同步),everysec(每秒同步一次),no(由操作系统决定).
3. AOF文件格式
举个例子, 如果客户端向服务器发送以下命令:
redis> SET KEY VALUE OK
那么服务器在执行这个 SET 命令之后, 会将以下协议内容追加到 aof_buf
缓冲区的末尾:
*3\r\n$3\r\nSET\r\n$3\r\nKEY\r\n$5\r\nVALUE\r\n
4. AOF重写
目的: 解决aof文件越来越大的问题
1) AOF重写会重新生成一个aof文件,是经过压缩的aof文件
2) AOF重写是通过读取键值对来实现的,和之前的AOF文件无关