1、概述
1.1定义
- RDB (Redis Database) 是 Redis 的默认持久化机制,它能够在指定的时间间隔内将内存中的数据集快照写入磁盘。
- RDB 持久化产生的文件是一个经过压缩的二进制文件,通过该文件可以还原生成 RDB 文件时的数据库状态。
1.2特点
- 一次性全量备份:RDB 是 Redis 数据的完整备份,通常在一个单独的文件中,包含了某个时间点 Redis 的所有数据。
- 数据紧凑:由于 RDB 文件是二进制文件,且采用了压缩技术,所以它的体积通常比 AOF 文件小得多。
- 恢复速度快:由于 RDB 文件的读写效率很高,因此 Redis 重启时加载 RDB 文件的速度比加载 AOF 文件的速度要快很多。
- 存储数据安全:RDB 持久化会将数据写入磁盘,因此即使 Redis 进程崩溃,也可以通过 RDB 文件进行数据恢复。
2、持久化
2.1过程
- RDB持久化可以手动执行(使用SAVE命令)或由服务器定期执行(根据配置选项)。
- 自动触发:通过在Redis的配置文件redis.conf中设置save参数值来开启RDB自动持久化。例如,
save 900 1
表示在900秒内如果至少有1个key的值变化,则生成RDB文件。 - 手动触发:
- SAVE命令:阻塞服务器进程,直到RDB文件创建完毕。不推荐在生产环境中使用。
- BGSAVE命令:在后台异步执行快照生成,不会阻塞服务器处理客户端请求。Redis内部几乎所有的RDB操作都采用BGSAVE命令。
2.2主要步骤
- 触发:通过自动或手动的方式触发RDB持久化。
- fork子进程:执行bgsave命令时,Redis父进程会fork出一个子进程。这个子进程拥有父进程内存数据的副本。
- 生成RDB文件:子进程读取内存数据,将数据写入一个RDB临时文件中。这个过程对父进程是异步的,父进程可以继续处理其他客户端请求。
- 写入变更数据:如果父进程在子进程生成RDB文件期间修改了数据,父进程会通过写时复制(COW)机制将这些变更数据复制到新的内存区域,并在RDB临时文件写入完成后,将这些变更数据也写入RDB临时文件中。
- 替换旧文件:子进程完成RDB临时文件的写入后,会通知父进程。父进程会将RDB临时文件重命名为正式的RDB文件,并替换旧的RDB文件。至此,RDB持久化完成。
3、应用场景
- 定期备份:由于 RDB 文件是 Redis 数据的完整备份,因此可以用于定期备份 Redis 数据,以防止数据丢失。
- 数据迁移:当需要将 Redis 数据从一个实例迁移到另一个实例时,可以使用 RDB 文件作为数据迁移的媒介。
- 快速恢复:在 Redis 服务器崩溃或数据丢失的情况下,可以通过加载 RDB 文件来快速恢复数据。