redis持久化
一. RDB持久化
1.1 RDB持久化的一些特性
用save(阻塞)和bgsave(非阻塞,派生一个子进程来处理)可以生成RDB文件.
因为AOF文件的更新频率比RDB高,所以如果开启了AOF会优先使用AOF来还原数据库状态.
服务器在载入RDB文件期间会一直阻塞,直到完成.
1.2 自动保存间隔
我们可以在配置文件中配置.
save 900 1;save 300 1;
分别代表900秒内进行至少一次修改,300秒内至少一次修改,那么就会执行BGSAVE
1.3 RDB文件结构
RDB保存的都是二进制文件
db_version:长度4个字节,代表RDB文件的版本号
databases:保存各个数据库的键值对
EOF:长度为1字节,表示RDB文件结束.
check_sum:8字节无符号整数,保存着一个校验和.
具体的databases的结构如下图所示
selectdb:默认的常量
db_number:数据库对应的编号
key_value_pairs:由类型,键,值组成(type,key,value)
1.4 分析RDB文件
在控制台执行od -c dump.rdb命令,可以看到rdb文件的二进制表示
0000000 R E D I S 0 0 0 7 372 \t r e d i s
0000020 - v e r 005 3 . 2 . 8 372 \n r e d i
0000040 s - b i t s 300 @ 372 005 c t i m e 133
0000060 [ s 216 Z 372 \b u s e d - m e m 302 220
0000100 _ 017 \0 377 [ 036 t 240 223 < 300 )
0000114
二.AOF持久化
与RDB持久化通过保存数据库键值对不同,AOF方式是通过保存执行的写命令来记录数据库状态的.
2.1 AOF持久化功能的实现
AOF持久化功能的实现分为命令追加(append),文件写入,文件同步(sync)三个步骤.
redis服务器进程就是一个事件循环,服务器在处理文件事件时可能会执行写命令,使得一些内容被追加到aof缓冲区中,所以每次结束事件处理的时候,都要考虑是否要将AOF缓冲区的内容写入和保存到AOF文件里面.
appendfsync选项 | 行为 |
always | 写入AOF并同步AOF(最安全最慢,最多丢失一条数据) |
everysec(默认) | 写入AOF,如果距离上次同步超过1秒,则同步aof,这个操作由另外一个线程完成(最多丢失1秒的数据) |
no | 写入不同步,何时同步由操作系统决定 |
2.2 AOF文件的载入与数据还原
具体还原步骤如下:
1.创建一个伪客户端.
2.从AOF中读取命令
3.使用伪客户端发送命令
2.3 AOF重写
随着时间的流逝,AOF文件的体积会越来越大,所以需要重写AOF来精简它.redis服务器会创建一个新的AOF文件代替旧的AOF文件.
举个例子: 执行1000次 incre msg 1,AOF会把这1000条命令精简为set msg 1000.
由于aof重写会阻塞进程,所以通常将AOF重写放到子进程去.以便于进程可以继续处理命令请求,不过这样也有一个问题,AOF重写过程中,新的命令如何同步?
redis设计了一个AOF重写缓冲区,它在服务器创建子进程之后开始使用,当redis执行完一个写命令的时候,它会同时把这个命令发送给AOF缓冲区和重写缓冲区.