RDB

将当前内存数据生成快照文件。

AOF

实时将写命令存入AOF文件。

如何用

RDB如何用?

默认情况下Redis是采用了RDB的方式来持久化数据,持久化文件存储路径通过配置属性dir。RDB分为手动触发和自动触发。

  • 手动触发

通过执行savebgsave命令执行。save命令执行过程会造成客户端阻塞,而bgsave会fork出一个子进程进行RDB的操作,不会造成客户端阻塞。如果执行shutdown命令默认也会执行bgsave命令。

  • 自动触发:

通过配置 save m n, 它表示在 m 秒内数据集存在n修改会自动触发bgsave

AOF 如何用?

默认情况下Redis对AOF是关闭的,需要通过配置 appendonly yes 进行开启。AOF的方式通过缓冲区同步文件的策略来持久化数据,需要通过配置appendfsync 属性控制,不同值的含义如下:

  • always

命令写入缓冲区后,调用系统fsync操作同步到AOF文件中。

  • everysec

命令写入缓冲区后,调用系统write操作,write操作完成后 ,fsync同步文件操作,由专门线程每秒操作一次

  • no

命令写入缓冲区后,调用系统write操作,write操作完成后。同步操作由操作系统负责,通常同步周期最长30秒

注意:如果两种持久化的方式都开启,那么会优先采用AOF。

RDB和AOF原理窥探

RDB

由于save命令会造成客户端阻塞问题,一般主流都会采用bgsave命令。bgsave命令执行的工作流程如图1-1:

打开网易新闻 查看精彩图片

(1). 接收到bgsave命令后,Redis父进程判断是否存在fork子进程。如果存在直接返回。
(2). 不存在,fork出子进程持久化当前内存的数据至RDB文件。父进程fork子进程的这一时间段,对其他客户端传入的命令是阻塞的。
(3). 执行完毕,通知父进程,记录相应的统计信息。

AOF

AOF的工作流程如图1-2

打开网易新闻 查看精彩图片

(1). 父进程接受写命令将命令放入缓冲区。
(2). 根据appendfsync配置的策略,将缓冲区的命令写入AOF文件。
(3). 根据重写的配置策略,判断是否触发重写。

AOF通过缓冲区aof_buf来提高了日志记录的性能,如果不通过缓冲区,那么性能瓶颈将会限制于写入磁盘时的速率。

随着写命令的不断写入,AOF文件会逐渐膨胀,文件中可能会存在一些废弃无用的命令(如:set k1 v1 ,del k1 v1, set k2 v2 , del k2 v2。内存中并没有k1和k2的值,但AOF文件中存入这些命令是没有意义的),导致后面恢复数据时执行无效命令浪费时间,所以AOF提供了重写的机制,根据内存中现有数据生成新的AOF文件。重写机制分为手动触发和自动触发

  • 手动触发

直接调用bgrewriteaof命令

  • 自动触发

通过配置auto-aof-rewrite-min-sizeauto-aof-rewirte-percentage参数确定触发时机。

两者比较

RDB不能实时保证数据的准确性,在Redis不同版本上的迁移存在不可预期的问题,但恢复数据速度快。AOF能保证实时的数据准确性,恢复数据相对较慢。所以现在主流的持久化方式都是采用AOF。