redis持久化

2021-03-10  本文已影响0人  鸿雁长飞光不度

Redis文件的创建与载入

通过执行save(阻塞)或者bgsave(异步执行)生成RDB文件,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),文件写入,文件同步。

appendsync

appendfsync flushAppendOnlyFile函数行为
always 将aof缓冲区所有内容写入并同步到AOF文件
everysec(默认) 将aof_buf缓冲区所以偶内容写入AOF文件,如果上次同步AOF文件超过1s,将再次对AOF文件进行同步,由专门线程负责执行。
no 将aof_buf缓冲区所有内容写入AOF,但不对AOF文件进行同步,何时同步由操作系统完成。
  1. 创建一个不带网络连接的伪客户端
  2. 从AOF文件种分析并读取出一条写命令
  3. 使用伪客户端执行谢明了
  4. 重复执行2,3。

是通过读取服务器当前数据库状态实现的,读取数据库某个key的最新状态后,替换掉之前对应key的多条命令。

一个命令执行的命令过长的时候,会拆分成多个命令,比如sadd 元素数量过多。

redis将AOF重写程序放到子进程执行。


问题:aof重写期间服务器进程继续处理命令请求,新的命令可能对数据库状态修改,导致当前数据库状态和AOF保存的数据不一致。

解决问题方案:设立了AOF重写缓冲区,会将执行AOF重新期间的产生的新命令放在缓冲区。当aof重写完成后,在将AOF重写缓冲区产生的指令写入到
AOF文件末尾

上一篇下一篇

猜你喜欢

热点阅读