RDB 持久化简介
RBD 持久化数据库
RDB 持久化是将 Redis 在内存中的数据库状态保存到磁盘中,以避免数据意外丢失,是一种快照式的持久化方法。
RDB 还原数据库
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 命令可以用于生成 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 文件还原数据库状态
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 命令