RDB持久化
RDB文件的创建和载入
SAVE命令:直接阻塞服务器
BGSAVE命令:派生出一个子进程来创建RDB文件。
RDB的载入工作是在服务器启动的时候自动载入。
SAVE命令执行时服务器的状态:阻塞
BGSAVE命令执行时服务器的状态:服务器仍然可以处理客户端的请求。
RDB在服务器启动时,自动载入,会一直处于阻塞状态,直到载入工作完成。
自动间隔保存
服务器每隔一段时间自动执行BGSAVE命令。
save 900 1
save 300 10
save 60 1000
满足上面三个条件中的一个就会自动执行BGSAVE命令,进行创建RDB。
设置保存条件
redis服务器的构造
struct redisServer{
//一个数组,保存服务器中的所有数据库
redisDb *db;
//服务器的数据库数量
int dbnum;
//记录保存条件的数组
struct saveparam *saveparam;
//计数器(距离上次执行BGSAVE命令或者SAVE 进行了多少次修改)
long long dirty;
//上一次执行保存的时间(执行BGSAVE命令或者SAVE)
time_t lastsave;
}redisServer
其中saveparam的结构如下
我们将上述的3个保存条件(save 900 1 …)保存到saveparam数组里。
检查保存条件是否满足
将dirty属性的值与saveparam数组里的changes比较
将当前时间与lastsave的差值 。此差值与saveparam数组里的seconds比较
满足了条件(save 900 1…)就会进行执行BGSAVE命令创建RDB。
RDB文件结构
RDB是一个经过压缩的二进制文件,由多个部分组成
对于不同类型的键值对,RDB文件会使用不同的方式来保存。
AOF持久化
与RDB不同的是,AOF是通过保存所执行的写命令来记录数据库的状态。
命令追加
redis服务器的构造
struct redisServer{
//一个数组,保存服务器中的所有数据库
redisDb *db;
//服务器的数据库数量
int dbnum;
//记录保存条件的数组
struct saveparam *saveparam;
//计数器(距离上次执行BGSAVE命令或者SAVE 进行了多少次修改)
long long dirty;
//上一次执行保存的时间(执行BGSAVE命令或者SAVE)
time_t lastsave;
//AOF缓冲区
sds aof_buf;
}redisServer
会将命令追加到aof_buf缓冲区的末尾。
文件写入
将aof_buf里的内容保存到AOF文件。
三个默认选项:always、everysec、no
文件同步
将内存里的AOF同步到磁盘。
AOF 重写将多条命令写为一条,并且覆盖旧AOF文件。
AOF与RDB的区别
- 保存数据库的状态不一样。RDB保存数据库的内容,AOF保存数据库的命令。
- 若果发生服务器异常关闭,RDB丢失的数据会更多。AOF每秒种保存一次AOF文件,RDB需在满足时间和次数的条件下才会保存。
- Redis默认是开启RDB的,AOF默认关闭,需要手动开启;RDB和AOF同时开启的情况下,会只加载AOF
- AOF耗费性能。并且文件内容大,恢复速度比RDB慢。