Redis 是一个键值对数据库服务器, 服务器中通常包含着任意个非空数据库, 而每个非空数据库中又可以包含任意个键值对. 服务器中的非空数据库以及他们的键值对统称为数据库状态.
Redis 的 RDB (Redis DataBase) 持久化功能将 Redis 某个时间点上的数据库状态保存到一个 RDB 文件中.
RDB 文件的创建和载入
生成 RDB 文件的命令: 阻塞创建 (SAVE)、非阻塞创建 (BGSAVE).
RDB 文件的载入在服务器启动时自动载入.
如果服务器开启了 AOF 持久化功能, 那么服务器会优先使用 AOF 文件来还原数据库. 只有在 AOF 持久化功能处于关闭状态时, 服务器才会使用 RDB 文件来还原数据库状态.
SAVE 命令执行时客户端发送的所有命令请求都会被拒绝.
BGSAVE 执行期间:
- 客户端发送的 SAVE 命令会被服务器拒绝
- 客户端发送的 BGSAVE 命令会被拒绝
- BGREWRITEAOF 和 BGSAVE 不能同时执行
- 如果 BGSAVE 命令正在执行, 那么客户端发送的 BGREWRITEAOF 命令会被延迟到 BGSAVE 命令之后执行
- 如果 BGREWRITEAOF 命令正在执行, 那么客户端发送的 BGSAVE 命令会被拒绝
RDB 文件载入时会一直处于阻塞状态, 直到载入完成为止.
配置文件redis.conf可以配置 BGSAVE 执行频率.
检查条件是否满足
Redis 的服务器周期性操作函数 serverCron 默认每100ms 就执行一次, 对正在运行的服务器进行维护, 其中一项工作就是检查 SAVE 选项所设置的保存条件是否已经满足, 若满足则执行 BGSAVE 命令.
RDB 文件结构
REDIS | db_version | databases | EOF | check_sum |
---|
- REDIS,长度5字节, 保存着 “REDIS” 五个字符。 通过这五个字符, 可以在载入文件时, 快速检查载入文件是否 RDB 文件。
- db_version ,长度 4 字节, 它的值是一个字符串表示的整数, 这个整数记录了 RDB 文件的版本号
- databases 部分包含着零个或任意多个数据库, 以及各个数据库中的键值对数据
- EOF 常量的长度为 1 字节, 这个常量标志着 RDB 文件正文内容的结束
- check_sum 是一个 8 字节长的无符号整数, 保存着一个校验和,以此来检查 RDB 文件是否出错或损坏