持久化机制
-
RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照
-
AOF 持久化记录服务器执行的所有写操作命令,在服务器启动的时候,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。
-
Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。
RDB
Redis 将数据库快照保存在名字为 dump.rdb 的二进制文件中。
你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。
你也可以通过调用 SAVE 或者 BGSAVE , 手动让 Redis 进行数据集保存操作。
设置会让 Redis 在满足“ 60 秒内有有 1000 个键被改动”这一条件时, 自动保存一次数据集:
save 60 1000
优点
- RDB 是 Redis 默认采用的持久化方式。
- RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集。
- RDB 持久化方式的的性能比较出色,父进程在保存 RDB 文件时唯一要做的就是
fork(系统级别的操作函数)出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O 操作。 - RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
缺点
- 它是根据配置的保存时间点来持久化数据的(假设你设置了5m),那么RDB就会以每次5分钟的频率来备份数据。在这种情况下, 一旦发生故障停机, 就可能会丢失这5分钟的数据。
- 每次保存 RDB 的时候,Redis 都要
fork()出一个子进程,并由子进程来进行实际的持久化工作。 在数据集比较庞大时,fork()可能会非常耗时,可能会导致服务器在一段时间内停止处理客户端的请求。
执行过程
- fork出一个子进程。
- 子进程将数据集写到一个临时RDB文件中。
- 把之前的持久化RDB文件替换为当前的临时文件,并且删除旧的RDB文件。
AOF
优点
- 使用 AOF 持久化会让 Redis 的数据变很安全:可以设置不同的 同步策略。
- 每次有新命令追加到 AOF 文件时就执行一次同步:非常慢,也非常安全。
- 每秒同步一次:足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失 1 秒钟的数据。
- 从不主动同步:将数据交给操作系统来处理。更快,也更不安全的选择。
- AOF 文件是一个只进行追加操作的日志文件(append only log), 因此对 AOF 文件的写入不需要进行
seek, 即使日志因为某些原因而包含了未写入完整的命令(比如写入时磁盘已满,写入中途停机,等等),redis-check-aof工具也可以轻易地修复这种问题。 - Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合(重写的规则是:假如客户端将set命令执行了100次,那么重写的后的aof文件就是 set 1,2,3........100。会将100次set命令重写成1次set。从而减少aof的体积大小)。 整个重写过程也是安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。
缺点
- AOF 文件的体积会比 RDB 文件的大,所以它的恢复策略速度也会比RDB慢
执行过程
- fork楚一个子进程。
- 子进程开始将新 AOF 文件的内容写入到临时文件。
- 对于所有新执行的写入命令,父进程一边将它们累积到一个内存缓存中,一边将这些改动追加到现有 AOF 文件的末尾: 这样即使在重写的中途发生停机,现有的 AOF 文件也还是安全的。
- 当子进程完成重写工作时,它给回调父进程 告诉父进程它重写完了,父进程在接收到信号之后,将内存缓存中的所有数据追加到新 AOF 文件的末尾。
- 然后Redis 用这个文件替换旧的aof文件,之后所有命令都会直接追加到新 AOF 文件的末尾。
#开启aof持久化方式
appendonly yes
#AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的。
dir ./
#默认的文件名是appendonly.aof,可以通过appendfilename参数修改
appendfilename appendonly.aof
混合持久化
Redis 4.0 之后新增的方式,混合持久化是结合了 RDB 和 AOF 的优点,在写入的时候,先把当前的数据以 RDB 的形式写入文件的开头,再将后续的操作命令以 AOF 的格式存入文件,这样既能保证 Redis 重启时的速度,又能减低数据丢失的风险。
aof-use-rdb-preamble yes #开启混合持久化方式