由两道面试题引发的对redis中AOF持久化的思考
redis持久化
redis中的AOF持久化是什么?
redis的持久化方式一共有两种,RDB和AOF方式。RDB是通过rdb文件来保存服务器在某个时间的数据来达到持久化,AOF是通过aof文件来保存服务器的每条命令,以此来达到数据的持久化
RDB持久化
RDB持久化是redis服务器中默认开启的,是通过SAVE和BGSAVE命令来保存的。RDB持久化也是可以配置定时保存的标准,每当服务器达到这个标准,就保存一次。由于是对AOF的描述,所以在这里并不对RDB做过多的描述。
AOF持久化
AOF持久化的步骤分为命令追加、文件写入、文件同步三个步骤。命令追加是把命令写入缓冲区。
AOF文件的写入和同步
服务器在结束一个事件循环之前,都会调用flushAppendOnlyFile函数。而flushAppendOnlyFile函数的行为由appendFsync选项值的决定的。redis默认的值是everysec,即如果距上次保存的时间超过一秒,就把缓冲区中的命令写入aof文件。
AOF文件的载入与数据与数据还原
redis在载入aof文件时会创建一个伪客户端,然后从aof文件中读取一条命令,利用伪客户端执行aof的命令,判断是否执行完,执行完毕的话载入完毕。没有执行完毕的话会一直执行读取命令,客户端执行aof命令,知道读取完毕。下图是aof文件载入的流程:
AOF文件的重写
AOF文件会随着服务器运行时间的增加,文件大小会越来越大,如果不加以控制,过大的aof文件会对服务器造成影响,这时就需要aof文件的重写,而产生的文件比原来的aof文件体积更小。aof文件在重写过程中会维护一个aof重写缓冲区,在缓冲区中会创建一个子进程来进行aof得到重写,这样就避免了在重写期间造成服务器的阻塞。当子进程的重写完成之后,服务器会将aof重写缓冲区的内容追加到新的aof文件中,来保证新的aof文件和服务器的状态保持一致。最后,服务器会替换掉旧的aof文件,一次来完成aof文件的重写操作。