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持久化的实现
- 命令追加:当AOF持久化功能处于打开状态时,服务器在执行完一个写命令后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾。
- 文件写入:调用flushAppendOnlyFile函数,考虑是否将aof_buf缓冲区的内容写入和保存到AOF文件里面,此函数的行为由服务器配置的appendfsync选项的值来决定
- 文件同步
3.AOF文件的载入与数据还原
4.AOF重写
为了解决写命令过多导致AOF文件体积膨胀的问题,提供了AOF文件重写功能,即将生成新AOF文件替换成旧AOF文件。
原理:首先从数据库中读取键现在的值,然后用一条命令去记录键值对,代替之前记录这个键值对的多条命令。
后台重写:为了解决数据不一致问题,Redis服务器设置了一个AOF重写缓冲区,这个缓冲区在服务器创建子进程之后使用,当Redis服务器执行完一个写命令后,它会同时将这个写命令发送给AOF缓冲区和AOF缓冲区,当子进程完成AOF重写工作后,父进程会将AOF重写缓冲区中的所有内容写入到新AOF文件内,对新的AOF文件进行改名,原子的覆盖现有的AOF文件,完成新旧两个AOF文件的替换。