Redis学习(六)—— Redis持久化机制

Redis自身提供了两种持久化方式,分别是RDB快照方式和AOF(Append-only file)方式。

RDB方式: RDB持久性以指定的时间间隔执行数据集的时间点快照

RDB的优点:

  1. RDB非常适合备份,可以在发生灾难的时候轻松恢复不同版本的数据。
  2. RDB适合备份,可以复制文件
  3. 提高了性能,主进程不需要I/O操作
  4. 和AOP比启动更快

RDB的缺点:

  1. 如果数据的完整性要求较高,RDB就不适合
  2. RDB在执行备份的时候会fork一个线程,如果数据集很大会很费时,可能会导致redis服务在几毫秒内停止服务。

RDB运行的流程

  1. 当需要执行快照的时候,redis会fork一个子线程
  2. 子线程会将数据写到临时的RDB文件中去
  3. 当临时的RDB文件写完之后会替换原来的RDB文件

AOF方式: AOF方式会记录服务器接收到的每个写入操作,这些操作将在服务器启动时再次播放,重建原始数据集。使用与Redis协议本身相同的格式以附加方式记录命令

AOF的优势:

  1. 数据安全性更高,可以设置每个操作都进行追加日志,也可以1秒钟进行一次,数据丢失的少
  2. 由于AOF只追加日志,如果宕机或者停电数据不会发生损坏。甚至一个命令写到一半挂掉了,也可以使用redis-check-aof命令进行修复。
  3. 当日志变得太大的时候,可以在后台进行自动重写。重写是完全安全的,因为在Redis继续附加到旧文件时,会创建一个全新的文件,并创建当前数据集所需的最少操作集,一旦准备好第二个文件,Redis将切换两个文件并开始追加到新的那一个。
  4. AOP就是将一个接一个的操作记录到日志中去。即使使用flushall命令删除了所有数据,只要没有进行重写操作,只需要停止服务,删除flushall命令。重新启动redis就可以恢复数据。

AOF的缺点:

  1. 文件体积比相同数据的RDB文件要大
  2. AOF方式持久化会比RDB更耗费服务器资源

AOF执行的流程

  1. Redis进行fork操作,现在就有了一个子线程一个父线程
  2. 子线程开始在临时文件中写入操作
  3. 父线程继续提供服务,会将数据更改放入内存缓冲区,同时会继续写到旧的文件中去
  4. 如果子线程写入完成,父线程会将缓冲区的数据写入新文件
  5. 重新命名旧文件,并将新数据附加到新文件中

猜你喜欢

转载自my.oschina.net/u/1175305/blog/1815250