RDB和AOF持久化

RDB持久化

1.概念:将某个时间点上的数据库状态(键值对)保存到RDB文件中(磁盘里)。

save命令:服务器进程执行保存功能,阻塞Redis服务器进程,直到RDB文件创建完毕为止。

bgsave命令:Fork一个子进程,然后由子进程负责创建RDB文件,服务器进程继续处理命令请求。

通过save选项设置多个保存条件,只要其中任意一个条件被满足,服务器就会执行bgsave命令。

save 900 1 		// 服务器在900秒之内,对数据库进行了至少1次修改
save 300 10		//服务器在300秒之内,对数据库进行了至少10次修改
save 60 10000	//服务器在60秒之内,对数据库进行了至少10000次修改

dirty计数器和lastsave属性

dirty计数器记录距离上一次成功执行save命令或者bgsave命令之后,服务器对数据库状态进行了多少次修改。

lastsave记录了上次成功执行save命令或者bgsave命令的时间。

2.RDB文件结构

在这里插入图片描述

REDIS:5字节,保存“REDIS”字符,检查是否是RDB文件。

db_version:4字节,RDB文件的版本号。

database:包含任意多个数据库,以及各个数据库中的键值对数据。包含三部分:(SELECTDB一个字节表明接下来是一个数据库号码,db_number数据库号码,key_value_pairs键值对)

EOF:1字节,标志结束。

check_num:8字节,保存着校验和,检测文件出错或损坏。

3.分析RDB文件:

在这里插入图片描述
在这里插入图片描述

AOF持久化

1.概念:通过保存Redis服务器执行的写命令来记录数据库状态。

2.AOF持久化的实现

  1. 命令追加:当AOF持久化功能处于打开状态时,服务器在执行完一个写命令后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾。
  2. 文件写入:调用flushAppendOnlyFile函数,考虑是否将aof_buf缓冲区的内容写入和保存到AOF文件里面,此函数的行为由服务器配置的appendfsync选项的值来决定
  3. 文件同步

在这里插入图片描述

3.AOF文件的载入与数据还原

在这里插入图片描述

4.AOF重写

为了解决写命令过多导致AOF文件体积膨胀的问题,提供了AOF文件重写功能,即将生成新AOF文件替换成旧AOF文件。

原理:首先从数据库中读取键现在的值,然后用一条命令去记录键值对,代替之前记录这个键值对的多条命令。

后台重写:为了解决数据不一致问题,Redis服务器设置了一个AOF重写缓冲区,这个缓冲区在服务器创建子进程之后使用,当Redis服务器执行完一个写命令后,它会同时将这个写命令发送给AOF缓冲区和AOF缓冲区,当子进程完成AOF重写工作后,父进程会将AOF重写缓冲区中的所有内容写入到新AOF文件内,对新的AOF文件进行改名,原子的覆盖现有的AOF文件,完成新旧两个AOF文件的替换。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/gkq_tt/article/details/88529187