Redis自身提供了两种持久化方式,分别是RDB快照方式和AOF(Append-only file)方式。redis
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操做,如今就有了一个子线程一个父线程
- 子线程开始在临时文件中写入操做
- 父线程继续提供服务,会将数据更改放入内存缓冲区,同时会继续写到旧的文件中去
- 若是子线程写入完成,父线程会将缓冲区的数据写入新文件
- 从新命名旧文件,并将新数据附加到新文件中