RDB
Redis 是一个内存数据库,数据信息存储在内存中,一旦服务器进程退出,数据全部消失。为了解决这个问题,Redis提供了 RDB(Redis Database) 持久化功能,可以将数据保存到 RDB 文件中。
因为AOF 文件的更新频率通常比 RDB 文件的更新频率高,所以如果开启了 AOF 持久化功能,那服务器就会优先使用 AOF 文件来还原数据库。
RDB 文件的创建和载入
服务器在载入 RDB 文件期间,会一直处于阻塞状态。
可以使用两个命令生成 RDB 文件:
- save:save 命令会组折redis 服务器进程,知道 RDB 文件创建完毕。服务器阻塞期间,所有客户端请求都会被拒绝。
- bgsave:bgsave 命令是由子进程执行的。所以 Redis 服务器可以继续处理客户端请求。有三条命令不能执行:
-
- save 和 bgsave:bgsave 执行期间,save 和 bgsave会被直接拒绝。避免产生竞争。
-
- bgrewriteaof:出于性能考虑,避免两个进程同时进行磁盘写入。bgsave 执行期间,收到的 bgrewriteaof 命令会被延后到 bgsave执行完毕之后执行。bgrewriteaof 执行期间,收到的 bgsave 命令会被拒绝。
自动间隔保存
可以通过配置 save 选项,让服务器每隔一段时间自动执行一次 bgsave 命令。
保存条件:save m n。服务器在 m 秒之内,对数据库进行了至少 n 次修改。
可以配置多个条件,只要有一个满足,就执行 bgsave。
默认每个100毫秒执行一次 servercron 函数,进行周期性操作。同时检测是否满足save设置的保存条件。
RDB 文件结构
分析 RDB 文件
重点回顾
AOF
AOF 持久化的实现
AOF 持久化功能的实现可分为命令追加、文件写入、文件同步三个步骤。
Redis 内部有一个 aof_buf 缓冲区,服务器执行写命令后,会将指令追加到 aof_buf 中。
文件写入,指的是调用 系统 write 将 aof_buf 中的信息写入。数据可能在系统进行文件读写的缓冲区中。每个时间循环,都会调用 write 写入。
文件同步,指的是将文件数据由内存缓冲区写入到磁盘中。可以通过配置,更改同步的时机。
AOF 文件的载入
AOF 重写和后台重写
因为 AOF 持久化是通过保存被执行的写命令来记录数据库状态的,所以随着时间的流逝,AOF 文件内从会越来越多。此时就需要进行 AOF 文件重写。
文件重写,是通过读取数据库当前状态实现的。