一、说明
因为Redis是内存数据库, 它将自己的数据库状态储存在内存里面, 所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面, 那么一旦服务器进程退出,服务器中的数据库状态也会消失不见。
为了解决这个问题, Redis提供了RDB持久化功能, 这个功能可以将Redis在内存中的数据库状态保存到磁盘里面, 避免数据意外丢失。
RDB持久化既可以手动执行, 也可以根据服务器配置选项定期执行, 该功能可以将某个时间点上的数据库状态保存到一个RDB文件中。
RDB持久化功能所生成的RDB文件是一个经过压缩的二进制文件, 通过该文件可以还原生成RDB文件时的数据库状态。
因为RDB文件是保存在硬盘里面的, 所以即使Redis服务器进程退出, 甚至运行Redis服务器的计算机停机, 但只要RDB文件仍然存在, Redis服务器就可以用它来还原数据库状态。
二、RDB文件的创建和载入
有两个Redis命令可以用于生成RDB文件, 一个是SAVE, 另一个是BGSAVE。
SAVE命令会阻塞Redis服务器进程, 直到RDB文件创建完毕为止, 在服务器进程阻塞期间, 服务器不能处理任何命令请求。
和SAVE命令直接阻塞服务器进程的做法不同, BGSAVE命令会派生出一个子进程, 然后由子进程负责创建RDB文件, 服务器进程( 父进程) 继续处理命令请求。
另外值得一提的是, 因为AOF文件的更新频率通常比RDB文件的更新频率高, 所以:
- 如果服务器开启了AOF持久化功能, 那么服务器会优先使用AOF文件来还原数据库状态。
- 只有在AOF持久化功能处于关闭状态时, 服务器才会使用RDB文件来还原数据库状态。
用户可以通过save选项设置多个保存条件, 但只要其中任意一个条件被满足,服务器就会执行BGSAVE命令。
举个例子, 如果我们向服务器提供以下配置:
save 900 1
save 300 10
save 60 10000
那么只要满足以下三个条件中的任意一个, BGSAVE命令就会被执行:
- 服务器在900秒之内, 对数据库进行了至少1次修改。
- 服务器在300秒之内, 对数据库进行了至少10次修改。
- 服务器在60秒之内, 对数据库进行了至少10000次修改。
三、总结
- RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据。
- SAVE命令由服务器进程直接执行保存操作, 所以该命令会阻塞服务器。
- BGSAVE令由子进程执行保存操作, 所以该命令不会阻塞服务器。
- 服务器状态中会保存所有用save选项设置的保存条件, 当任意一个保存条件被满足时, 服务器会自动执行BGSAVE命令。
- RDB文件是一个经过压缩的二进制文件, 由多个部分组成。
- 对于不同类型的键值对, RDB文件会使用不同的方式来保存它们。
参考资料:《redis设计与实现》
上一篇:【redis深层次探索】数据结构和对象【七】-- 对象
下一篇:【redis深层次探索】AOF持久化
不积跬步,无以至千里;不积小流,无以成江海!