Redis自身提供了两种持久化方式,分别是RDB快照方式和AOF(Append-only file)方式。
RDB方式: RDB持久性以指定的时间间隔执行数据集的时间点快照
RDB的优点:
- RDB非常适合备份,可以在发生灾难的时候轻松恢复不同版本的数据。
- RDB适合备份,可以复制文件
- 提高了性能,主进程不需要I/O操作
- 和AOP比启动更快
RDB的缺点:
- 如果数据的完整性要求较高,RDB就不适合
- RDB在执行备份的时候会fork一个线程,如果数据集很大会很费时,可能会导致redis服务在几毫秒内停止服务。
RDB运行的流程
- 当需要执行快照的时候,redis会fork一个子线程
- 子线程会将数据写到临时的RDB文件中去
- 当临时的RDB文件写完之后会替换原来的RDB文件
AOF方式: AOF方式会记录服务器接收到的每个写入操作,这些操作将在服务器启动时再次播放,重建原始数据集。使用与Redis协议本身相同的格式以附加方式记录命令
AOF的优势:
- 数据安全性更高,可以设置每个操作都进行追加日志,也可以1秒钟进行一次,数据丢失的少
- 由于AOF只追加日志,如果宕机或者停电数据不会发生损坏。甚至一个命令写到一半挂掉了,也可以使用redis-check-aof命令进行修复。
- 当日志变得太大的时候,可以在后台进行自动重写。重写是完全安全的,因为在Redis继续附加到旧文件时,会创建一个全新的文件,并创建当前数据集所需的最少操作集,一旦准备好第二个文件,Redis将切换两个文件并开始追加到新的那一个。
- AOP就是将一个接一个的操作记录到日志中去。即使使用flushall命令删除了所有数据,只要没有进行重写操作,只需要停止服务,删除flushall命令。重新启动redis就可以恢复数据。
AOF的缺点:
- 文件体积比相同数据的RDB文件要大
- AOF方式持久化会比RDB更耗费服务器资源
AOF执行的流程
- Redis进行fork操作,现在就有了一个子线程一个父线程
- 子线程开始在临时文件中写入操作
- 父线程继续提供服务,会将数据更改放入内存缓冲区,同时会继续写到旧的文件中去
- 如果子线程写入完成,父线程会将缓冲区的数据写入新文件
- 重新命名旧文件,并将新数据附加到新文件中