Redis 持久化
RDB
RDB 持久化方式类似于快照,执行 SAVE BGSAVE命令时可以触发 RDB 持久化,执行 shutdown 命令也会触发,其本质为 SAVE,设置自动触发本质是执行 BGSAVE 命令。在同时开启 RDB 和 AOF 是 redis 优先载入AOF。
SAVE 命令
SAVE 命令会阻塞 redis 服务器进程,直到 rdb 文件生成完成,期间 redis 服务器无法正常处理请求。
BGSAVE 命令
BGSAVE 命令会 fork 一个子进程生成 rdb 文件,期间 redis 服务器可以正常处理请求。
当执行 BGSAVE 命令时,服务器为了避免产生竞争,会拒绝 SAVE 命令和 BGSAVE 命令。
当执行 BGSAVE 命令时,客户端发送的 BGREWRITEAOF 命令会延迟到 BGSAVE 执行完后进行。
当执行 BGREWRITEAOF 时,服务器会拒绝客户段发送的 BGSAVE 命令。
redis 出于对性能的考虑,不同时执行 BGREWRITEAOF 和 BGSAVE 命令,因为这会产生两个子进程,同时进行大量的 IO 操作。
自动间隔保存实现
redis 每隔 100s 执行 serverCron 函数,改函数用于检查是已满足配置的自动保存条件,若满足则执行 BGSAVE 命令。

数据结构如上所示,saveparams 为配置项, dirty 为计数器即对数据库进行了多少次更改,lastsave 为上次自动保存的时间。
RDB 文件结构
RDB 文件的大致结构如下,其中全大写表示常量。

未完待续
网友评论