Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。 对此,Redis 提供了持久化功能!

Redis 数据持久化共有两种数据,分别是 RDB 和 AOF。接下来看看那这两种持久化方式有什么异同。

RDB

RDB 全称也叫 Redis Database

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。Redis 使用 RDB 的持久化流程如下。

img

Redis 会单独创建(fork) 一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上一次的持久化文件。

在整个过程中,主进程是不进行任何 IO 操作的。这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效。

RDB 的缺点是最后一次持久化后的数据可能丢失。

配置

当时间到多少秒时,如果 redis 数据发生了至少几次变化,则执行 bgsave

# Save the DB to disk.
#
# save <seconds> <changes>
save 60 5

触发机制

  • 在 save 的规则满足的情况下,会自动触发 rdb 规则
  • 执行 flushdb,也会触发 rdb 规则
  • 退出 redis ,也会生成 rdb 文件

如何恢复

  • 只需要将 rdb 文件放在我们 redis 启动目录就可以,redis 启动的时候会自动检查 dump.rdb 恢复其中的数据

  • 查看需要存在的位置

    127.0.0.1:6379>config get dir
    1) "dir"
    2) "/usr/loca1/bin” # 如果在这个目录下存在 dump.rdb 文件,启动就会自动恢复其中的数据

优点

  • 适合大规模的数据恢复
  • 对数据的完整性不高

缺点

  • 需要一定的时间间隔去操作,如果 Redis 崩了,那么最后一次修改数据就没有了。
  • fork 进程的时候,会占用一定的内存。

AOF

AOF 全称是 Appnd Only File。

它其实是日志,但是通过日志形式来记录每个写操作,将 Redis 执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,Redis 启动之初会读取该文件重新构建数据,换言之, Redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

配置

默认是不开启的,需要手动进行配置,将其开启。我们只需要将 appendonly 改为 yes 就开启了 aof !

appendonly yes
# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"

如何修复

由于 AOF 是记录写操作的,如果这个文件被破坏,那么我们可以这样修复,即使用 redis-check-aof 命令来修复。

D:\Development\Redis>redis-check-aof.exe --fix appendonly.aof
0x              f6: Expected prefix '*', got: 'f'
AOF analyzed: size=267, ok_up_to=246, ok_up_to_line=51, diff=21
This will shrink the AOF from 267 bytes, with 21 bytes, to 246 bytes
Continue? [y/N]: y
Successfully truncated AOF

重写规则

AOF 默认就是文件的无限追加,文件会越来越大!

# Automatic rewrite of the append only file.
# Redis is able to automatically rewrite the log file implicitly calling
# BGREWRITEAOF when the AOF log size grows by the specified percentage.
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

如果超过 64 mb,那么就创建一个新文件。

优点

  • 每一次修改都同步,文件的完整会更加好
  • 每秒同步一次,可能会丢失一秒的数据
  • 从不同步,效率最高的!

缺点

  • 相对于数据文件来说,AOF 远远大于 RDB,修复的速度也比 RDB 慢!
  • AOF 运行效率也要比rdb慢,所以我们 Redis 默认的配置就是 RDB 持久化!

小结

  • RDB 持久化方式能够在指定的时间间隔内对你的数据进行快照存储
  • AOF 持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,
  • AOF 命令以 Redis 协议追加保存每次写的操作到文件末尾,Redis 还能对 AOF 文件进行后台重写,使得 AOF 文件的体积不至于过大。
  • 只做缓存,如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化
  • 如果同时开启两种持久化方式
    • 在这种情况下,当 redis 重启的时候会优先载入 AOF 文件来恢复原始的数据,因为在通常情况下 AOF 文件保存的数据集要比 RDB 文件保存的数据集要完整。
    • RDB 的数据不实时,同时使用两者时服务器重启也只会找 AOF 文件,那要不要只使用 AOF 呢?作者建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),快速重启,而且不会有 AOF 可能潜在的 Bug,留着作为一个万一的手段。