Redis文件的创建与载入
通过执行save(阻塞)或者bgsave(异步执行)生成RDB文件,RDB文件在服务器启动的时候自动执行。
- 如果服务器开启了AOF持久化功能,优先使用AOF文件还原数据库状态。
- 只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件还原数据库状态。
- BGSAVE命令和BGREWRITEAOF命令不能同时到达
- 服务器载入RDB文件期间,会一直阻塞状态,直到完全载入为止。
自动间隔性保存
bgsave命令自动执行
save 900 1 900秒内对数据库进行了至少一次修改
dirty计数器:每次修改增加1
lastsave属性:记录上次服务器修改的时间。
通过saveParams的条件,根据serverCron函数100ms检查条件是否符合
RDB文件结构
REDIS|db_version|databases|EOF|check_sum|
databases:database_0 database_1 database_2
AOF 持久化实现
aof持久化功能的实现可以分为命令追加(append),文件写入,文件同步。
-
命令追加
aof持久化功能打开状态时,服务器在执行完一个写命令后,会以协议格式将被执行的写命令
追加到aof_buf缓冲区末尾 -
AOF文件的写入和 同步
在事件循环中,接收客户端命令请求,以及向客户端发送命令回复。在每次结束一个事件循环
之前调用flushAppendOnlyFile,根据策略决定
appendsync
appendfsync | flushAppendOnlyFile函数行为 |
---|---|
always | 将aof缓冲区所有内容写入并同步到AOF文件 |
everysec(默认) | 将aof_buf缓冲区所以偶内容写入AOF文件,如果上次同步AOF文件超过1s,将再次对AOF文件进行同步,由专门线程负责执行。 |
no | 将aof_buf缓冲区所有内容写入AOF,但不对AOF文件进行同步,何时同步由操作系统完成。 |
- AOF文件的载入与数据还原
- 创建一个不带网络连接的伪客户端
- 从AOF文件种分析并读取出一条写命令
- 使用伪客户端执行谢明了
- 重复执行2,3。
- AOF重写
是通过读取服务器当前数据库状态实现的,读取数据库某个key的最新状态后,替换掉之前对应key的多条命令。
一个命令执行的命令过长的时候,会拆分成多个命令,比如sadd 元素数量过多。
redis将AOF重写程序放到子进程执行。
- AOF重写期间,服务器进程可以继续处理命令请iu去。
- 子进程带有服务器进程的数据副本,使用子进程不是线程,可以避免使用锁的情况下,保证数据安全性。
问题:aof重写期间服务器进程继续处理命令请求,新的命令可能对数据库状态修改,导致当前数据库状态和AOF保存的数据不一致。
解决问题方案:设立了AOF重写缓冲区,会将执行AOF重新期间的产生的新命令放在缓冲区。当aof重写完成后,在将AOF重写缓冲区产生的指令写入到
AOF文件末尾
网友评论