RDB 持久化简介

RBD 持久化数据库

redis开启 redis开启rdb持久化_持久化

RDB 持久化是将 Redis 在内存中的数据库状态保存到磁盘中,以避免数据意外丢失,是一种快照式的持久化方法。

RDB 还原数据库

redis开启 redis开启rdb持久化_服务器_02

RDB 持久化将生成一个 RDB 文件(经过压缩的二进制文件),通过该文件可以还原生成 RDB 文件时的数据库状态。

因为 RDB 文件保存在磁盘中,即使 Redis 宕机,只要 RDB 文件仍然存在,Redis 服务器就可以还原数据库状态。

开启 RDB 持久化功能

默认已开启 RDB 持久化功能,如果需要关闭 RDB 持久化功能,需要修改 redis.conf 配置文件,如下:

# 开启 RDB 持久化功能(默认)
#   save ""
save 900 1
save 300 10
save 60 10000

# 关闭 RDB 持久化功能
save ""
# save 900 1
# save 300 10
# save 60 10000

RDB 文件的创建与写入

redis开启 redis开启rdb持久化_服务器_03

有两个 Redis 命令可以用于生成 RDB 文件,一个是 SAVE,另一个 BGSAVE

SAVE 命令
127.0.0.1:6379> save
OK

SAVE 命令会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕为止,在 Redis 服务器进程阻塞期间,不能处理任何命令请求,所以 Redis 客户端发送的所有请求都会被拒绝

BGSAVE 命令
127.0.0.1:6379> bgsave
Background saving started

BGSAVE 命令会派生一个子进程,然后由子进程负责创建 RDB 文件,Redis 服务器进程(父进程)不会被阻塞,可以继续处理命令请求,所以 Redis 客户端发送的所有请求都会被处理

注:BGSAVE 命令执行期间,Redis 客户端发送 SAVE、BGSAVE 和 BGWRITEAOF 命令都会被拒绝

自动间隔性保存

因为 BGSAVE 命令可以在不阻塞服务器进程的情况下执行,所以 Redis 允许用户通过设置服务器配置的 save 选项,让服务器每隔一段时间自动执行一次 BGSAVE 命令

save 900 1 # 服务器在 900 秒之内,对数据库进行了至少 1 次修改
save 300 10 # 服务器在 300 秒之内,对数据库进行了至少 10 次修改
save 60 10000 # 服务器在 60 秒之内,对数据库进行了至少 10000 次修改

RDB 文件的加载

Redis 并没有专门用于加载 RDB 文件的命令,RDB 文件的加载工作是在 Redis 服务器启动时自动执行的,即只要 Redis 服务器在启动时检测到 RDB 文件存在,它就会自动加载 RDB 文件。

Redis 服务器启动时打印的日志记录如下:

1521:M 09 Mar 2021 12:35:43.769 * DB loaded from disk: 0.000 seconds # 加载 RDB 文件
1521:M 09 Mar 2021 12:35:43.769 * Ready to accept connections

注:AOF 文件更新频率通常比 RDB 文件高,数据保存完整性更好,所以开启 AOF 持久化功能后 Redis 服务器会优先使用 AOF 文件来还原数据库状态;只有在 AOF 持久化功能关闭时,Redis 服务器才会使用 RDB 文件还原数据库状态

redis开启 redis开启rdb持久化_持久化_04

RDB 持久化的优缺点

RDB 持久化优点
  • 体积更小:相同的数据量的 RDB 文件比 AOF 文件要小,因为 RDB 文件是紧凑型压缩文件
  • 恢复更快:因为 RDB 文件是数据库状态的快照,基本上就是数据的复制,不用重新读取再写入内存
  • 性能更高:父进程在保存 RDB 文件时只需要 fork() 一个子进程,无需父进程的进行其他 I、O操作,从而保证 Redis 服务器的性能
RDB 持久化缺点
  • 故障丢失数据:Redis 服务器出现故障时,使用 RDB 持久化可能会丢失部分数据
  • 耐久性差:数据量很大时 RDB 比 AOF 持久化更加耗时和消耗 CPU 资源

总结

  • RDB 持久化就是将内存中数据库数据保存到磁盘中
  • RDB 文件是一个经过压缩的二进制文件
  • RDB 文件用于保存和还原 Redis 服务器所有数据库中的所有键值对数据
  • SAVE 命令由 Redis 服务器进程直接执行保存操作,该命令会阻塞 Redis 服务器
  • BGSAVE 命令由子进程执行保存操作,该命令不会阻塞 Redis 服务器
  • 服务器状态中会保存所有用 SAVE 选项设置的保存条件,当任意一个保存条件被满足时,服务器会自动执行 BGSAVE 命令