Redis11-AOF持久化

除了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页

二、AOF文件的载入与数据还原

三、AOF重写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值