RDB 持久化机制
RDB
全称为:Redis DataBase
,是 Redis
当中默认的持久化方案。当触发持久化条件时,Redis
默认会生成一个 dump.rdb
文件,Redis
在重启的时候就会通过解析 dump.rdb
文件进行数据恢复。
RDB 机制触发条件
RDB
持久化机制有两种触发方式:自动触发和手动触发。
自动触发
自动触发方式也可以分为三种:
- 执行
flushall
命令(flushdb
命令不会触发)时,不过此时生成的dump
文件内的数据是空的(dump
文件还会存储一些头信息,所以文件本身是有内容的,只是没有数据),没有什么太大的实际意义。 - 执行
shutdown
命令时会触发生成dump
文件。 - 通过配置文件自动生成,
Redis
中配置文件默认配置如下,只要达到这三个条件中的任意一个,就会触发Redis
的RDB
持久化机制。
save 900 1 //900秒内至少有1个key被添加或者更新
save 300 10 //300秒内至少有10个key被添加或者更新
save 60 10000 //60秒内至少有10000个key被添加或者更新
手动触发
除了自动触发,Redis
中还提供了 2
个手动触发 RDB
机制的命令(这两个命令不能同时被执行,一旦一个命令正在执行中,另一个命令会被拒绝执行):
save
:这个命令会阻塞Redis
服务器进程,直到成功创建RDB
文件,也就是说在生成RDB
文件之前,服务器不能处理客户端发送的任何命令。bgsave
:父进程会执行fork
操作来创建一个子进程。RDB
文件由子进程来负责生成,父进程可以正常处理客户端发送的命令(这里也是Redis
不仅仅只是单线程的一个体现)。
如果想要知道上一次成功执行 save
或者 bgsave
命令的时间,可以执行 lastsave
命令进行查看,lastsave
命令返回的是一个 unix
时间戳。
RDB 机制相关配置文件
除了上面提到的触发生成 rdb
文件的配置参数,RDB
持久化机制还有如下一些相关命令:
-
dir
:rdb
文件生成目录。默认是./
(当前目录),可以执行命令config get dir
进行查看,如下图所示说明当前dump
文件生成目录为/usr/local/redis-5.0.5/bin
:
dbfilename
:rdb
文件名。默认是dump.rdb
。rdbcompression
:rdb
文件是否是LZF
压缩文件。默认是yes
。rdbchecksum
:是否开启数据校验。默认是yes
。
RDB 机制优点
RDB
是一个非常紧凑的压缩文件,保存了不同时间点上的文件,非常适合用来灾备和数据恢复。RDB
最大限度地提高了Redis
的性能,因为Redis
父进程需要做的唯一的工作就是派生一个子进程来完成剩下的工作,父进程永远不会执行磁盘I/O
或类似的耗时操作。- 与后面介绍的
AOF
持久化机制比较,RDB
方式恢复数据的速度更快。
RDB 机制缺点
RDB
无法做到实时备份,所以如果Redis
因异常停止工作而没有正确的关机,那么从上一次备份的到异常宕机的这一段时间的数据将会丢失。- 2、
RDB
通常需要父进程来执行fork
操作创建子线程,所以如果频繁执行fork
操作而CPU
性能又不是很高的话可能会造成短时间内父进程不可用。
AOF 持久化机制
AOF
全称为:Append Only File
,是 Redis
当中提供的另一种持久化机制。AOF
采用日志的形式将每个写操作追加到文件中。开启 AOF
机制后,只要执行更改 Redis
数据的命令时,命令就会被写入到 AOF
文件中。在 Redis
重启的时候会根据日志内容依次执行 AOF
文件中的命令来恢复数据。
AOF
和 RDB
最大的不同是:AOF
记录的是执行命令(类似于 MySQL
中 binlog
的 statement
格式),而RDB
记录的是数据(类似于 MySQL
中 binlog
的 row
格式)。
需要注意的是:假如同时开启了 RDB
和 AOF
两种机制,那么 Redis
会优先选择 AOF
持久化文件来进行数据恢复。
AOF 机制如何开启
AOF
机制默认是关闭的,可以通过以下配置文件进行修改
appendonly no //是否开启AOF机制,默认是no表示关闭,修改为yes则表示开启
appendfilename “appendonly.aof” //AOF文件名