RDB(Redis DataBase)
redis存储的数据生成快照并存储到磁盘等介质上
单独创建(fork)一个子进程来进行持久化,而主进程是不会进行任何IO操作的,这样就确保了redis极高的性能。
RDB的触发机制
指令手动触发
save,该指令会阻塞当前 Redis 服务器
bgsave,执行该命令时,Redis 会在后台异步执行快照操作,此时 Redis 仍然可以响应客户端请求
redis.conf 配置自动触发
配置文件中配置:save 900 1 # 如果 900s 内,至少有 1 个 key 进行了修改,进行持久化操作
serverCron 自动触发的 RDB 相当于直接调用了 bgsave 指令的流程进行处理
AOF(Append Only File)
redis执行过的所有写指令记录下来
只允许追加不允许改写的文件
配置redis.conf中的appendonly yes就可以打开AOF功能
AOF持久化策略是每秒钟fsync一次
redis提供了redis-check-aof工具,可以用来进行日志修复
redis提供了AOF文件重写(rewrite)机制,即当AOF文件的大小超过所设定的阈值时,redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集
AOF重写
redis会创建(fork)一个“重写子进程”,这个子进程会首先读取现有的AOF文件,并将其包含的指令进行分析压缩并写入到一个临时文件中。
主工作进程会将新接收到的写指令一边累积到内存缓冲区中,一边继续写入到原有的AOF文件中
当“重写子进程”完成重写工作后,它会给父进程发一个信号,父进程收到信号后就会将内存中缓存的写指令追加到新AOF文件中
当追加结束后,redis就会用新AOF文件来代替旧AOF文件,之后再有新的写指令,就都会追加到新的AOF文件中了。
AOF 持久化功能的实现
命令追加( append ):被执行的写命令追加到 Redis 服务端维护的 AOF 缓冲区末尾
文件写入和同步( write ):AOF 缓冲区根据对应的策略向硬盘进行同步操作。
调用 flushAppendOnlyFile函数
always:一旦AOF缓冲区有数据时,就调用fsync命令强制往AOF文件写数据
everysec(默认):当AOF缓冲区有数据时,就调用write命令往io缓冲区写数据,同时每秒调用一次fsync命令强制将io缓冲区的数据写入到aof文件(redis性能、数据可控性适中)
no:当AOF缓冲区有数据时,就调用wirte命令往io缓冲区写数据
文件重写(rewrite):随着 AOF 文件越来越大,需要定期对 AOF 文件进行重写,达到压缩的目的。
重启加载(load):当 Redis 重启时,可以加载 AOF 文件进行数据恢复。
AOF 数据恢复
创建一个不带网络连接的的伪客户端( fake client)
从 AOF 文件中分析并取出一条写命令
使用伪客户端执行被读出的写命令
一直执行步骤 2 和步骤3,直到 AOF 文件中的所有写命令都被处理完毕为止
RDB-AOF混合持久化
通过aof-use-rdb-preamble配置参数控制,yes则表示开启
持久化扩展
RDB 持久化方式能够在指定的时间间隔内进行快照存储
服务器重启的时候会重新执行这些命令来恢复原始 的数据
当redis重启的时候会优先载入AOF文件来恢复原始的数据
因为RDB更适合用于备份数据库(AOF在不断变化不好备份),快速重启