redis 的持久化有两种方式:rdb全量持久化和aof增量持久化;
AOF优先级更高,在AOF开启状态下,且存在AOF文件,优先使用AOF恢复数据 ;
RDB
命令
- save 在主进程中执行任务,会阻塞服务器
- bgsave 在子进程中执行任务,非阻塞
生成
- 手动执行命令
- 配置文件,save后的数字表示多少秒内对数据库进行了几次修改:
- save 900 1
- save 300 10
- save 60 10000
载入
服务器启动时,若未开启AOF持久化,则自动加载rdb文件进行数据恢复;
AOF - Append Only File
配置
通过配置文件中的配置项进行开启AOF功能:
- appendonly yes ## 开启aof持久化
- appendfilename "aofname.aof" ## aof文件的文件名
- appendfsync everysec ## 每个事件循环中,是否将aof缓冲区中的内容写入并同步到aof文件,选项见下文
实现:
- 命令追加: 服务器执行完写命令后,会以协议格式将命令追加到服务器状态的aof_buf缓冲区;
- 文件写入: redis事件循环中,每次处理完IO事件和时间事件后,会考虑是否要将aof_buf中的内容写入到aof文件中,该行为由
appendfsync
配置选项控制always
每个事件循环都会将aof_buf中的内容写入并同步到aof文件everysec
将aof_buf中的内容写入文件,并判断上次同步的时间,超过一秒(默认)就同步no
将aof_buf中的内容写入到文件,何时同步由操作系统决定
- 文件同步
AOF 重写
因为aof文件中记录的是所有写命令,因此数据频繁变化时冗余较大,为解决此问题,引入aof重写功能;
aof重写并不分析aof文件,而是依据当前的数据快照生成写命令,替换掉原来的aof文件;
aof由子进程在后台重写,带来新的问题,在重写期间产生的新的写命令,会造成数据库与aof文件中的数据不一致;为此,redis 设置了一个aof缓冲区,这个缓冲区在创建执行重这与任务的子进程创建后启用,当redis执行完命令,会同时发送给aof缓冲区和aof重写缓冲区;