RDB 持久化
为了解决服务器关闭,数据消失的问题, redis通过 RDB 持久化功能,将数据库的状态保存到磁盘里面,避免数据丢失。
RDB 持久化功能生成的 RDB 文件是一个经过压缩的二进制文件,通过该文件可以还原当时的数据状态。
一、RDB 文件的创建和载入
SAVE 和 BGSAVE 都能用于生成RDB 文件。
- SAVE命令会阻塞Redis服务器进程,直到 RDB 文件创建完毕为止
- BGSAVE 会创建一个子进程,负责创建 RDB 文件,不会阻塞主进程
- 当 Redis 服务器在启动时检测到RDB 文件存在,它就会自动载入 RDB 文件
AOF文件的更新频率比 RDB 文件高。
- 当服务器开启了 AOF 持久化功能,那么会优先使用 AOF 文件来还原数据库状态
- 当AOF 关闭的时候,才会使用 RDB 文件
- 载入 RDB 文件期间,服务器一直处于阻塞状态
二、自动间隔性保存
由于 BGSAVE 不会阻塞服务器,因此可以设置成定时执行。
1、设置保存条件
save 900(时间) 1(执行次数)
save 300 10
save 60 10000
设置服务器的 save 选项之后,服务器程序会根据这个设置redisServer 结构的 saveparams 属性
2、dirty 计数器和lastsave 属性
- dirty 计数器:记录上次 save 或者 BGSAVE 之后,服务器对数据库状态进行了多少次增删改操作
- lastsave:UNIX时间戳,记录上一次 BGSAVE 或者 SAVE 的时间
3、检查保存条件是否满足
redis 服务器的定时任务serverCron作用之一就是检查是否满足 SAVE 条件,满足的话就进行 SAVE 操作。
三、RDB 文件结构
db_version: 四字节整数,表示RDB 文件的版本号
database: 包含0 或任意多个数据库,以及各个数据库中的键值对数据
EOF:1 字节常量,标志 RDB 文件正式结尾
check_sum:8 字节无符号整数,保存对前四个计算得出的校验和(验签)
对于不同类型的键值对,RDB 文件会采用不同的方式来保存他们。
AOF持久化
AOF:Append Only File
通过保存 Redis 服务器所执行的写命令来记录数据库状态的。
一、持久化功能实现
包括命令追加、文件写入、文件同步三个步骤。
1、命令追加
服务器在执行完一个写命令以后,会以协议格式,将被执行的写命令追加到服务器状态的aof_buf 缓冲区的末尾。
2、AOF 文件的写入和同步
服务器在每次结束一个循环之前,都会调用flushAppendOnlyFile 函数,考虑是否将 aof_buf 缓冲区中的内容写入和保存到AOF 文件里。
函数根据appendfsync属性值,进行不同情况的操作。
二、AOF 文件的载入与数据还原
服务器只需要读入并执行一遍 AOF 文件中的命令,就可以还原服务器关闭之前的数据库状态。
创建一个无网络连接的伪客户端,然后不断读入并执行 AOF 文件的命令,直到结束为止。
三、AOF 重写
重写功能是为了减少 AOF 文件的体积,去除冗余的命令,通过新创建一个 AOF 文件来实现。
1、AOF 文件重写的实现
aof_rewriter函数生成的新 AOF 文件只包含还原当前数据库状态所必须的命令,所以新 AOF 文件不会浪费任何空间。
2、AOF 后台重写
-
如果服务器直接调用aof_rewriter函数的话,会被大量的写入操作阻塞,期间无法处理客户端发来的其他命令。
-
所以 redis 将 AOF 重写放到子线程中,除了避免阻塞,也可以保证数据的安全性。
- 在子线程执行时,服务器进程要将执行后的命令追加到缓冲区和重写缓冲区
- 子线程执行结束时,主线程会将 AOF 重写缓冲区的命令写入到新的 AOF 文件中,然后替换旧的 AOF 文件