Redis学习笔记-持久化
一、RDB持久化
1. 持久化方式
手动执行、定期执行
2. 持久化执行过程
1) 创建RDB二进制文件
- SAVE命令: 阻塞Redis服务器进程,直到文件创建完成。
- BGSAVE命令: 创建一个子进程来创建文件。 用于定期执行RDB持久化
BGSAVE命令执行时,不能同时执行SAVE、BGSAVE、BGREWRITEAOF命令。
其中,不能同时执行BGREWRITEAOF命令是为了性能考虑
2) 载入RDB二进制文件
自动载入。
如果开启了AOF持久化,就载入AOF文件;否则,载入RDB文件
3)记录参数
- dirty计数器
距离上一次成功执行SAVE或者BGSAVE命令之后,服务器对数据库进行了多少次CRUD操作
- lastsave属性
记录上一次成功执行SAVE或者BGSAVE命令的时间戳
4)设置保存条件
- seconds 秒数
- changes 修改数
当服务器在seconds秒之内,对数据库进行了至少changes此修改时,会对Redis进行RDB持久化
可以设置多个类似条件对Redis持久化
- 校验条件的定时任务:
默认会有一个100ms执行一次的定时任务,判断保存条件是否满足
- 校验方法:
通过dirty和lastsave来判断保存条件是否满足。如果满足,执行BGSAVE命令
5) RDB文件存储格式
- “REDIS” + 版本号 + 多个数据库键值对部分 + EOF结束符 + 校验和
- 对于不同的类型的键值对,RDB文件会用不同的方式保存它们
二、AOF持久化
1. AOF与RDB持久化区别
RDB持久化:保存数据库中的键值对
AOF持久化:保存Redis服务器所执行的写命令
2. 持久化执行过程
1)命令追加
服务器在执行命令后,会将协议内容追加到aof_buf缓冲区的末尾
2) AOF文件的写入与同步
写入:服务器每次结束一个事件循环之前,都会判断是否将aof_buf缓冲区的数据写入到AOF文件中
同步:由于write函数将数据写入到文件时,会暂时将数据保存到缓冲区中,当缓冲区满了或者超过时限时,才会真正将数据写入到磁盘中。
所以,需要同步操作强制让操作系统立即将缓冲区中的数据写入到硬盘中
3.数据还原过程
创建一个不带网络连接的伪客户端,从AOF文件读取命令,并逐条执行
4. AOF重写
随着服务器运行时间的增加,AOF的文件越来越多,通过重写AOF文件,达到精简执行命令的目的