RDB 持久化

RDB 全称 Redis Database Backup file(Redis 数据备份文件),也被叫做 Redis 数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当 Redis 实例故障重启后,从磁盘读取快照文件,恢复数据。

快照文件称为 RDB 文件,默认是保存在当前运行目录。

  1. # redis-cil
  2. > save # 由 Redis 主进程来执行 RDB,会阻塞所有命令
  3. > bgsave # 开启子进程执行 RDB, 避免主进程受到

Redis 停机时会执行一次 RDB

Redis 内部有触发 RDB 的机制,可以在 redis.conf 文件中找到,格式如下:

  1. # 900秒内,如果至少有1个key被修改,则执行 bgsave , 如果是 save "" 则表示禁用RDB
  2. save 900 1
  3. save 300 10
  4. save 60 10000

RDB 的其它配置也可以在 redis.conf 文件中设置:

  1. # 是否压缩 ,建议不开启,压缩也会消耗cpu,磁盘的话不值钱
  2. rdbcompression yes
  3. # RDB 文件名称
  4. dbfilename dump.rdb
  5. # 文件保存的路径目录
  6. dir ./

bgsave 开始时会 fork 主进程得到子进程,子进程共享主进程的内存数据。完成 fork 后读取内存数据并写入 RDB 文件。

fork 采用的是 copy-on-write 技术:

  • 当主进程执行读操作时,访问共享内存;
  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作。

Redis 持久化 - 图1

RDB 方式 bgsave 的基本流程:

  • fork 主进程得到一个子进程,共享内存空间
  • 子进程读取内存数据并写入新的 RDB 文件
  • 用新 RDB 文件替换旧的 RDB 文件。

RDB 会在什么时候执行?save 60 1000代表什么含义?

  • 默认是服务停止时。
  • 代表 60 秒内至少执行 1000 次修改则触发 RDB

RDB的缺点?

  • RDB 执行间隔时间长,两次 RDB 之间写入数据有丢失的风险
  • fork 子进程、压缩、写出 RDB 文件都比较耗时

AOF 持久化

AOF 全称为 Append Only File(追加文件)。Redis 处理的每一个写命令都会记录在 AOF 文件,可以看做是命令日志文件。

AOF 默认是关闭的,需要修改 redis.conf 配置文件来开启 AOF:

  1. # 是否开启AOF功能,默认是no
  2. appendonly yes
  3. # AOF文件的名称
  4. appendfilename "appendonly.aof"

AOF 的命令记录的频率也可以通过 redis.conf 文件来配:

  1. # 表示每执行一次写命令,立即记录到AOF文件
  2. appendfsync always
  3. # 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
  4. appendfsync everysec
  5. # 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
  6. appendfsync no
配置项 刷盘时机 优点 缺点
always 同步刷盘 可靠性高,几乎不丢数据 性能影响大
everysec 每秒刷盘 性能适中 最多丢失 1 秒数据
no 操作系统控制 性能最好 可靠性较差,可能丢失大量数据

因为是记录命令,AOF 文件会比 RDB 文件大的多。而且 AOF 会记录对同一个 key 的多次写操作,但只有最后一次写操作才有意义。通过执行 bgrewriteaof 命令,可以让 AOF 文件执行重写功能,用最少的命令达到相同效果。

Redis 也会在触发阈值时自动去重写 AOF 文件。阈值也可以在 redis.conf 中配置:

  1. # AOF文件比上次文件 增长超过多少百分比则触发重写
  2. auto-aof-rewrite-percentage 100
  3. # AOF文件体积最小多大以上才触发重写
  4. auto-aof-rewrite-min-size 64mb

Redis 持久化小结

RDB 和 AOF 各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。

RDB AOF
持久化方式 定时对整个内存做快照 记录每一次执行的命令
数据完整性 不完整,两次备份之间会丢失 相对完整,取决于刷盘策略
文件大小 会有压缩,文件体积小 记录命令,文件体积很大
宕机恢复速度 很快
数据恢复优先级 低,因为数据完整性不如 AOF 高,因为数据完整性更高
系统资源占用 高,大量 CPU 和内存消耗 低,主要是磁盘 IO 资源,但 AOF 重写时会占用大量 CPU 和内存资源
使用场景 可以容忍数分钟的数据丢失,追求更快的启动速度 对数据安全性要求较高常见