Redis的持久化机制

35 阅读2分钟

Redis的持久化机制

对内存中的数据进行持久化也就是将内存中的数据写入到硬盘中

redis支持三种持久化机制

RDB二进制快照、AOF日志持久化、RDB和AOF的混合持久化

RDB持久化

将内存中RDB的数据以二进制格式快照的方式保存到硬盘的RDB文件中

包括save和bgsave指令,redis停机,Save会阻塞主线程,bgsave会创建子进程生成RDB文件。

定期执行快照保存,可能会导致数据丢失。快照持久化,可通过一定时间内数据变化的数量进行持久化。

AOF持久化

AOF以日志的形式记录每个操作,将操作追加到文件末尾,类似事务日志 记录日志的时间

执行命令之后再记录日志。避免检查语法的开销, 可能会阻塞后续的命令执行。

先写入AOF缓冲区,然后在进行刷盘。

有文件自动重写功能,达到存储最后一次写操作。

AOF文件大和恢复速度可能比RDB慢

AOF记录日志是在主线程中进行的。

AOF的持久化方式

1.write完立即写入磁盘

2.后台线程每秒写入一次磁盘

3.由操作系统决定 写入page cach进行异步刷盘

三种方式区别在于fsync的时机,从系统内核缓冲区保存到磁盘上,即使是第一种方式也有丢失一天数据的可能,如刚执行完命令就宕机

AOF重写

AOF重写是在子进程中进行重写的过程是读取当前数据库中的所有键值对,然后将每个键值对用一条命令记录到新的AOF文件中,完成后替换现有的AOF文件。重写缓冲区存放重写期间新增的命令日志。

AOF和RDB持久化的区别

RDBAOF
文件小直观,可以看到执行的命令
恢复数据快恢复执行速度慢
生成RDB文件占用CPU 资源和内存资源追加命令是在主线程中进行的
容易丢失数据
持久化过程中写时复制:减少内存复制带来的性能损耗

在AOF重写以及bgsave实现RDB快照保存时,都会用到写时复制

RDB和AOF的混合持久化

在AOF日志重写时,保存为RDB文件,重写缓冲区以AOF命令写入。