除了RDB持久化功能之外,Redis还提供了AOF(AppendOnlyFile)持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的,如图11-1所示。
举个例子,如果我们对空白的数据库执行以下写命令,那么数据库中将包含三个键值对:
redis> SET msg "hellor“
OK
redis> SADD fruits "apple" "banana" "cherry"
(integer)3
redis> RPUSH numbers 128 256512
(integer)3
RDB持久化保存数据库状态的方法是将msg、fruits、numbers三个键的键值对保存到RDB文件中,而AOF持久化保存数据库状态的方法则是将服务器执行的SET、SADD、RPUSH三个命令保存到AOF文件中。
被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的,因为Redis的命令请求协议是纯文本格式,所以我们可以直接打开一个AOF文件,观察里面的内容。例如,对于之前执行的三个写命令来说,服务器将产生包含以下内容的AOF文件:
2xins6rInSELECT\rInsilrinolrin
*3lrins3lrlnsETlrins3lrinmsglrins5irlnhellolrin
+5r\ns4\r\nSADD\rIns6\rinfruitslrlns5lrlnapplelrlns6lrlnbananalrlns6lrincherrylrln
5lrins5\rInRPUSHIrInS7rinnumberslrins31r1n1281rins3lr1n2561rins31r1n5121rin
在这个AOF文件里面,除了用于指定数据库的SELECT命令是服务器自动添加的之外,其他都是我们之前通过客户端发送的命令。
服务器在启动时,可以通过载入和执行AOF文件中保存的命令来还原服务器关闭之前的数据库状态,以下就是服务器载入AOF文件并还原数据库状态时打印的日志:
[8321105 Sep 11:58:50.448#Server started, Redisversion 2.9.11
[8321105 Sep 11:58:50.449*DB loaded from append only file: 0.000seconds
[8321105 Sep11:58:50.449The server iS nowready to accept Connections on port 6379
一、AOF持久化的实现
AOF持久化功能的实现可以分为命令追加(append)、文件写入、文件同步(sync)三个步骤。
1.1 命令追加
当AOF持久化功能处于打开状态时,服务器在执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的aofbuf缓冲区的末尾
struct redisServer {
//...
//AOF缓冲区
sds aof buf
//...
};
举个例子,如果客户端向服务器发送以下命令:
redis> SET KEY VALUE
OK
那么服务器在执行这个SET命令之后,会将以下协议内容追加到aofbuf缓冲区的末尾:
3lrlns3\rinSETlrlns3lr\nKEY\rlns5\rInVALUEIrIn
又例如,如果客户端向服务器发送以下命令:
redis> RPUSH NUMBERS ONE TWO THREE
(integer)3
那么服务器在执行这个RPUSH命令之后,会将以下协议内容追加到aof_buf缓冲区的末尾:
5VrInS5\rInRPUSHIrInS7rInNUMBERSIrInS3\rInONE\rins3lrinTWo\rins5lrInTHREEIrIF
以上就是AOF持久化的命令追加步骤的实现原理。
1.2 AOF文件的写入与同步
144页