剖析Redis持久化之AOF方式

上一篇对redis持久化之RDB方式进行了剖析。除了RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能。下面就来介绍一下AOF持久化功能。

1、AOF持久化原理

与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。并在服务器启动时,通过重新执行这些命令来还原数据库。如下图:

顺便提一句,被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的。因为Redis的命令请求协议是纯文本格式,所以我们是可以直接打开一个AOF文件,观察里面的内容的。

2、AOF持久化配置

首先在redis.conf文件开启aof持久化(默认没开启)

appendonly yes

然后对redis.conf文件中的“appendfsync”选项进行规则配置。不同的appendfsync值产生的持久化行为也不相同。

appendfsync=always

appendfsync设置为always时,服务器在每个事件循环中将aof_buf缓冲区中的所有内容写入并同步到AOF文件。从效率来说,是三个选项值当中最慢的一个,但从安全性来说,always是最安全的,因为即使出现故障停机,AOF持久化也只会丢失一个事件循环中所产生的命令数据。

#默认选项
appendfsync=everysec

appendfsync设置为everysec时,服务器在每个事件循环中将aof_buf缓冲区中的所有内容写入到AOF文件,并且每隔一秒将再次对AOF文件进行同步,并且这个同步操作是由一个线程专门负责执行的。从效率上来说,everysec模式足够快,并且就算出现故障停机,数据库也只丢失一秒钟的命令数据。

appendfsync=no

appendfsync设置为no时,服务器在每个事件循环中,将aof_buf缓冲区中的所有内容写入到AOF文件,但并不对AOF文件进行同步,何时同步由操作系统决定。从效率上来说,与everysec模式相当。AOF文件写入速度是最快的,但是单次同步时长是三种模式中最长的,当出现故障停机时,服务器将丢失上次同步AOF文件之后的所有写命令数据。

不论设置为以上三种的任一种情况,AOF持久化功能的实现基本可以分为命令追加(append)、文件写入、文件同步(sync)三个步骤。

3、AOF文件载入与数据还原

因为AOF文件里面包含了重建数据库状态所需的所有写命令,所以服务器只要读入并重新执行一遍AOF文件里面保存的写命令,就可以还原服务器关闭之前的数据库状态。

4、AOF重写

因为AOF持久化是通过保存被执行的写命令来记录数据库状态的,所以随着服务器运行时间的流逝,AOF文件中的内容会越来越多,文件的体积也会越来越大,如果不加以控制的话,体积过大的AOF文件很可能对Redis服务器、甚至整个服务器造成影响,并且AOF文件的体积越大,使用AOF文件来进行数据还原所需的时间就越多。 为了解决AOF文件体积膨胀的问题,Redis提供了AOF文件重写功能。通过该功能,Redis服务器会启动一个子进程,来创建一个新的AOF文件来替代现有的AOF文件,新旧两个AOF文件所保存的数据库状态相同,但新AOF文件不会包含任何浪费空间的冗余命令,所以新AOF文件的体积通常会比旧AOF文件的体积要小得多。

5、RDB持久化与AOF持久化对比

AOF文件的更新频率通常比RDB文件的更新频率高,所以如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据库状态;只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据库状态。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

golang模板template自定义函数用法示例

golang的模板十分强大,其中的unix管道风格函数调用很是喜欢. 模板中有很多内置可以参看pkg文档, 另外还可以实现自定义函数. 例子如下: packag...

3674
来自专栏Pythonista

redis主从同步

原理: 1. 从服务器向主服务器发送 SYNC 命令。 2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接...

882
来自专栏会跳舞的机器人

Redis持久化

Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大. 如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式. 你也可以同...

1722
来自专栏IT可乐

Redis详解(七)------ AOF 持久化

  上一篇文章我们介绍了Redis的RDB持久化,RDB 持久化存在一个缺点是一定时间内做一次备份,如果redis意外down掉的话,就会丢失最后一次快照后的所...

1000
来自专栏老马寒门IT

cookie 详解

HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起...

790
来自专栏LuckQI

Redis初识~持久化数据

1083
来自专栏晓晨的专栏

.NET Core 控制台应用程序使用异步(Async)Main方法

883
来自专栏崔庆才的专栏

一文详细揭秘 Redis 持久化,了解一下?

Redis 是一个开源( BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持的数据类型很丰富,如字符串、链表、集 合、以及散...

692
来自专栏WindCoder

Myeclipse错误集锦

Errors occurred during the build. Errors running builder 'DeploymentBuilder' on ...

701
来自专栏小特工作室

读取Pdm文件内容(含源码)

  Pdm文件,就是PowerDesigner软件生成的文件,用来设计数据库表结构非常适合。其实,它的文件存储格式就是Xml,网上有很多代码,可以读取pdm文件...

2209

扫码关注云+社区