0
点赞
收藏
分享

微信扫一扫

Redis-----AOF和RDB持久化

醉东枫 2022-08-03 阅读 95


文章目录

  • ​​RDB持久化​​
  • ​​RDB文件的创建和载入​​
  • ​​设置保存条件​​
  • ​​AOF持久化​​
  • ​​命令追加​​
  • ​​文件写入​​
  • ​​文件同步​​
  • ​​AOF与RDB的区别​​

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的结构如下

Redis-----AOF和RDB持久化_数组


我们将上述的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

Redis-----AOF和RDB持久化_redis_02

文件同步

将内存里的AOF同步到磁盘。
AOF 重写将多条命令写为一条,并且覆盖旧AOF文件。

AOF与RDB的区别

  1. 保存数据库的状态不一样。RDB保存数据库的内容,AOF保存数据库的命令。
  2. 若果发生服务器异常关闭,RDB丢失的数据会更多。AOF每秒种保存一次AOF文件,RDB需在满足时间和次数的条件下才会保存。
  3. Redis默认是开启RDB的,AOF默认关闭,需要手动开启;RDB和AOF同时开启的情况下,会只加载AOF
  4. AOF耗费性能。并且文件内容大,恢复速度比RDB慢。


举报

相关推荐

0 条评论