Redis持久化之AOF方式

1. 什么是Redis持久化

Redis是一款流行的使用内存作为缓存的Nosql数据库,在大部分情况下,Redis完全可以满足我们对于数据的读写需求,但是Redis只是将数据持久化到了内存中,这也就意味着数据只会存活在内存中,一旦Redis服务停止,数据即被清空,这对我们的应用来说是灾难性的。为了避免数据丢失,Redis提供了多种持久化的方式,其中AOF方式是其中一种,本文将围绕AOF的特性、工作原理和优缺点进行详细介绍。

2. AOF的基本原理

AOF(Append Only File)持久化方式是将写操作转化为日志,即将所有写操作(包括添加删除修改等)记录到日志中,然后将这些操作日志以追加的方式写入磁盘,当服务重启时,Redis会根据日志内容还原数据。相对于快照方式存储,这种方式更加安全,因为每次操作都会被记录下来,而且只会追加。何为“只追加”?我们可以先看下面的代码:

SET mykey "hello world"

APPEND mykey " redis"

此时mykey的值为“hello world redis”,看似这里对一个已有的key进行了修改,实则不然。AOF机制下,Redis对于对已经存在的key的修改命令调用是无效的,因为在Redis执行这个命令的时候,并未对原有数据进行修改,只是将这个命令记录在日志中。因此,每次的写操作只会追加到AOF文件的末尾,这也造就了AOF的优越性能。

3. AOF的工作原理

3.1 AOF文件形式

为了方便查看,以下为AOF文件的实例:

*3 

$3

SET

$5

mykey

$11

hello world

可以看到,AOF文件以Redis协议的形式进行存储,每一个命令的执行,都会以协议的形式被存储下来,写入AOF文件。

3.2 AOF重写

AOF重写是AOF机制的一项优化手段,随着时间推移,AOF文件会越来越大,长时间的日志文件可能会影响到系统的性能。针对此情况,我们可以使用AOF重写机制将AOF文件进行压缩,即将过期和错误的命令过滤掉,仅保留新数据生成新AOF文件,如下图所示:

重写的过程也是Redis将内存中数据持久化到磁盘的过程,会启动一个新的子进程用于逐步实现重写操作,重写完成后,用新的AOF文件替换旧的AOF文件。重写的频次可以设置。

3.3 AOF同步

当Redis使用AOF方式持久化被修改的数据时,是先将写请求缓存在内存中的,一旦写请求累积到一定量,Redis便会将请求以写文件的形式写入硬盘中,但是,如果在写入硬盘之前,内存出现了故障导致Redis服务被迫停止,那么写请求不会被写入AOF文件中,造成部分数据的丢失。为了保证数据持久化的安全性,Redis提供了3种AOF同步方式:

everysec:每秒钟同步一次

always:每次有数据修改都会同步

no:完全不同步,交由操作系统自己决定

每秒同步一次方式的缺点是万一在同步之前进程 Crash 了,会有一秒钟的数据丢失。always 方式,在每次修改数据后立即将写操作同步到硬盘,同步次数非常频繁,会对性能产生影响。

4. AOF的优缺点

4.1 优点

相对于快照方式,AOF保证了数据的完整性。

AOF采用以追加的方式写入磁盘,写操作效率非常高。

在数据量巨大的情况下,AOF重写对性能的提升非常明显,大大缩小了数据的存储占用。

4.2 缺点

AOF的数据量会随着时间的推移不断增大,需要定期重写。

AOF同步的性能较差,每次同步都会进行磁盘写入操作。

AOF重启的时间较长,在大型持久化数据时无法接受。

5. 小结

AOF是Redis数据持久化中比较重要的机制之一,其以日志形式记录写操作,并在异步传输到磁盘,保证了Redis的完整性。尤其在数据量逐渐增大的时候,AOF的重写机制能够保证系统的稳定性和性能。AOF虽然效率不及快照方式,但从长期来看,AOF的优势是比较明显的,操作记录的完整性为开发者留下了更多的可操作空间。

数据库标签