在前面我们已经介绍了Redis的持久化RDB和AOF。但是很多时候,我们需要考虑很多因素:服务器宕机数据丢失、持久化时的性能开销、持久化文件的大小以及数据恢复速度。RDB持久化,两次快照之间写入的数据可能会丢失,当写入流量较大且数据集也很大时,RDB中系统调用fork()的延迟和内存的开销也是一个问题。但是RDB比AOF文件占用的磁盘空间更小,并且从RDB中恢复数据的速度更快。事实上,我们可以同时启动这两个功能。

1、首先使用FLUSHALL命令清空数据

127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> BGREWRITEAOF #手动触发重写
Background append only file rewriting started
127.0.0.1:6379> BGSAVE #手动保存
Background saving started

2、查看RDB和AOF文件大小

[root@localhost redis]# ll appendonly.aof dump.rdb 
-rw-r--r--. 1 root root  0 Aug 19 14:26 appendonly.aof
-rw-r--r--. 1 root root 92 Aug 19 14:26 dump.rdb

3、使用DEBUG POPULATE命令导入测试数据

127.0.0.1:6379> DEBUG POPULATE 100000
OK
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started
127.0.0.1:6379> BGSAVE
Background saving started

4、查看RDB和AOF文件大小

[root@localhost redis]# ll appendonly.aof dump.rdb 
-rw-r--r--. 1 root root 4576803 Aug 19 14:27 appendonly.aof
-rw-r--r--. 1 root root 2277881 Aug 19 14:27 dump.rdb

5、查看AOF前20行信息

[root@localhost redis]# head -20 appendonly.aof 
*2
$6
SELECT
$1
0
*3
$3
SET
$9
key:69082
$11
value:69082
*3
$3
SET
$9
key:54220
$11
value:54220
*3

6、查看AOF文件的最后10行信息

[root@localhost redis]# tail -10 appendonly.aof 
key:25805
$11
value:25805
*3
$3
SET
$9
key:24460
$11
value:24460

7、将配置参数aof-use-rdb-preamble改为yes,然后使用BGREWRITEAOF命令触发AOF重写

127.0.0.1:6379> CONFIG GET aof-use-rdb-preamble
1) "aof-use-rdb-preamble"
2) "no"
127.0.0.1:6379> CONFIG SET aof-use-rdb-preamble yes
OK
127.0.0.1:6379> CONFIG GET aof-use-rdb-preamble
1) "aof-use-rdb-preamble"
2) "yes"
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started

8、查看RDB和AOF文件的大小

[root@localhost redis]# ll appendonly.aof dump.rdb 
-rw-r--r--. 1 root root 2277881 Aug 19 14:33 appendonly.aof
-rw-r--r--. 1 root root 2277881 Aug 19 14:27 dump.rdb

9、可以使用vim查看AOF文件(这里不做展示)

总结

  在默认情况下AOF文件比RDB文件占用的存储空间大,但是我们配置aof-use-rdb-preamble为yes后,来启用Redis4.x开始提供的新的混合持久化功能。开启该功能后,在重写AOF文件时,Redis首先会将数据集以RDB的格式存储到内存中并作为AOF文件的开始部分。在重写之后,Redis继续使用传统的AOF格式在AOF文件中记录写入命令。可以通过观察重写后的AOF文件头部和尾部来了解这种混合模式。如果启动了这种混合持久化,那么AOF文件的开头首先使用的是RDB格式,因为RDB压缩格式可以实现更快速的重写和加载数据文件,同时也保留AOF数据一致性更好的优点,所以Redis可以从混合持久化中获益。

  在Redis4.x之前的版本,我们可以同时启用RDB和AOF来实现最好的数据安全。但是Redis4.x之后的版本哦们建议启用AOF和混合持久化。但是混合持久化的启动必须要启动AOF持久化,否则没有意义。

  Redis的RDB转储和AOF重写不会同时进行。当Redis启动时,即便RDB和AOF持久化同时启用AOF、RDB文件都存在,则Redis总是会先加载AOF文件。这是因为AOF文件被认为能够提供更加好的数据一致性。当加载AOF文件时,如果启用了混合持久化,那么Redis将首先检查AOF文件的前5个字符。如果这5个字符为REDIS,那么该AOF文件就是混合格式。Redis服务器会先加载RDB部分,然后再加载AOF部分。