Redis提供了多种不一样级别的持久化方式:redis
- RDB 持久化能够在指定的时间间隔内产生数据集的时间点快照(point-in-time snapshot)
- AOF持久化记录服务器执行的全部写操做命令,并在服务器启动时,经过从新执行这些命令来还原数据集。AOF文件中的命令所有以Redis协议的格式来保存,新命令会被追加到文件的末尾.Redis还能够在后台对AOF文件进行重写(rewrite),使得AOF文件的体积不会超过保存数据集状态所需的实际大小。
- Redis还能够同时使用AOF和RDB持久化。在这种状况下,当Redis重启时,它会优先使用AOF文件来还原数据集,由于AOF文件保存的数据集一般比RDB文件所保存的数据集更完整。
- 能够关闭持久化功能,让数据只在服务器运行时存在。
RDB的优势
- RDB是一个很紧凑的文件,它保存了redis在某个时间点上的数据集。
- RDB很是适用于灾难恢复,它只有一个文件,而且内容紧凑,能够将它传送到别的数据中心
- 能够最大化redis的性能;父进程在保存RDB文件时,惟一要作的就是fork一个子进程,而后这个子进程就会处理接下来的全部保存工做,父进程无需执行任何磁盘I/O操做
- RDB在恢复大数据集的时候比AOF的速度要快
RDB的缺点
- 由于RDB是保存在某个时间点上的数据集,这样的话,服务器故障可能会丢失数据。
- 每次保存RDB的时候,redis要fork一个子进程,并由子进程来进行实际的持久化工做,在数据集比较大的时候,fork可能会很是耗时,可能会形成服务器中止处理客户端请求;若是数据集很是巨大,而且cpu比较紧张的话,那么 这种中止时间设置可能会长达整整1秒。虽然AOF重写也须要进行fork,但不管AOF重写的执行间隔有多长,数据的耐久性都不会有任何损失
AOF优势
- 使用AOF持久化会让redis变得很是耐久,你能够设置不一样的fsync策略,好比无fsync,每秒钟一次fsync,或者每次写入命令是fsync。AOF的默认策略为每秒钟fsync一次,在这种配置下,redis仍然能够保持良好的性能,而且就算发生故障停机,也最多只会丢失一秒钟的数据
- AOF文件只是一个日志文件追加操做(append only log),所以对AOF文件的写入不须要进行seek,即便日志由于某些缘由而包含了未写入完整命令(好比写入时, 磁盘满了,写入时中途停机等),redis-check-aof工具能够轻易的修复这种问题
- redis能够在AOF文件体积过大时,自动在后台对AOF进行重写,重写后的AOF文件包含了恢复当前数据集所需的最小命令集合。这个重写操做是绝对安全的,由于redis在建立新的AOF过程当中,会继续讲命令追加到现有的AOF文件里面,即便重写过程当中发生停机,现有的AOF文件也不会丢失,而一旦新AOF文件建立完毕,redis就会从旧文件切换到新AOF文件,并开始对新AOF文件进行追加操做
- AOF文件有序地保存了对数据库执行的全部写入操做,这些写入操做以redis协议的格式保存,所以AOF文件的内容很是容易被人读懂,对文件进行分析也很容易。处处AOF文件也很是简单。
AOF缺点
- 对于相同的数据来讲,AOF文件的体积一般要大于RDB文件的体积
- 根据所使用的fsync策略。AOF的速度可能会慢于RDB。
- AOF的bug,曾经由于个别命令的缘由,致使AOF文件在从新载入是,没法将数据集恢复成保存时的样子。