Redis 4.0 新功能简介:RDB-AOF 混合持久化

在过去, Redis 用户通常会因为 RDB 持久化和 AOF 持久化之间不同的优缺点而陷入两难的选择当中:

  • RDB 持久化能够快速地储存和恢复数据, 但是在服务器停机时却会丢失大量数据;

  • AOF 持久化能够有效地提高数据的安全性, 但是在储存和恢复数据方面却要耗费大量的时间。

为了让用户能够同时拥有上述两种持久化的优点, Redis 4.0 推出了一个能够“鱼和熊掌兼得”的持久化方案 —— RDB-AOF 混合持久化: 这种持久化能够通过 AOF 重写操作创建出一个同时包含 RDB 数据和 AOF 数据的 AOF 文件, 其中 RDB 数据位于 AOF 文件的开头, 它们储存了服务器开始执行重写操作时的数据库状态: 至于那些在重写操作执行之后执行的 Redis 命令, 则会继续以 AOF 格式追加到 AOF 文件的末尾, 也即是 RDB 数据之后。

创建包含混合持久化内容的 AOF 文件

在启用了 RDB-AOF 混合持久化功能的情况下, 如果我们执行以下命令:

127.0.0.1:6379> SET K1 "V1"
OK

127.0.0.1:6379> SET K2 "V2"
OK

127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started

127.0.0.1:6379> SET K3 "V3"
OK

127.0.0.1:6379> SET K4 "V4"
OK

那么 Redis 服务器将创建出包含以下内容的 AOF 文件:

$ od -c appendonly.aof
0000000    R   E   D   I   S   0   0   0   8 372  \t   r   e   d   i   s
0000020    -   v   e   r  \v   9   9   9   .   9   9   9   .   9   9   9
0000040  372  \n   r   e   d   i   s   -   b   i   t   s 300   @ 372 005
0000060    c   t   i   m   e 302   ~ 204 016   Z 372  \b   u   s   e   d
0000100    -   m   e   m 302 300   z 017  \0 372  \f   a   o   f   -   p
0000120    r   e   a   m   b   l   e 300 001 376  \0 373 002  \0  \0 002
0000140    K   1 002   V   1  \0 002   K   2 002   V   2 377   9 214   H
0000160  253 212   0   G 344   *   2  \r  \n   $   6  \r  \n   S   E   L
0000200    E   C   T  \r  \n   $   1  \r  \n   0  \r  \n   *   3  \r  \n
0000220    $   3  \r  \n   S   E   T  \r  \n   $   2  \r  \n   K   3  \r
0000240   \n   $   2  \r  \n   V   3  \r  \n   *   3  \r  \n   $   3  \r
0000260   \n   S   E   T  \r  \n   $   2  \r  \n   K   4  \r  \n   $   2
0000300   \r  \n   V   4  \r  \n
0000306

从文件的内容可以看出, 文件的前半部分储存的是 RDB 格式的数据, 而后半部分储存的则是 AOF 格式的数据。

启用 RDB-AOF 混合持久化

在目前版本中, RDB-AOF 混合持久化功能默认是处于关闭状态的, 为了启用该功能, 用户不仅需要开启 AOF 持久化功能, 还需要将 aof-use-rdb-preamble 选项的值设置为真, 就像这样:

$ cat redis.conf
appendonly yes
aof-use-rdb-preamble yes

$ redis-server redis.conf
9468:C 17 Nov 14:46:01.063 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
9468:C 17 Nov 14:46:01.064 # Redis version=999.999.999, bits=64, commit=1189d90d, modified=1, pid=9468, just started
9468:C 17 Nov 14:46:01.064 # Configuration loaded
9468:M 17 Nov 14:46:01.065 * Increased maximum number of open files to 10032 (it was originally set to 256).
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 999.999.999 (1189d90d/1) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 9468
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

9468:M 17 Nov 14:46:01.066 # Server initialized
9468:M 17 Nov 14:46:01.066 * Reading RDB preamble from AOF file...
9468:M 17 Nov 14:46:01.066 * Reading the remaining AOF tail...
9468:M 17 Nov 14:46:01.066 * DB loaded from append only file: 0.000 seconds
9468:M 17 Nov 14:46:01.066 * Ready to accept connections

结语

好的, 关于 RDB-AOF 混合持久化功能的介绍到此就结束了, 希望这篇文章能够帮助大家更好地了解 Redis 4.0 的新功能, 我将在接下来的更多文章中继续向大家介绍更多 Redis 4.0 的新功能。

黄健宏
2017.11.17