Redis的持久化目录导航:redis
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。数据库
Redis会单首创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程当中,主进程是不进行任何IO操做的,这就确保了极高的性能若是须要进行大规模数据的恢复,且对于数据恢复的完整性不是很是敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。缓存
Fork的做用是复制一个与当前进程同样的进程。新进程的全部数据(变量、环境变量、程序计数器等)数值都和原进程一致,可是是一个全新的进程,并做为原进程的子进程。服务器
BGSAVE:Redis会在后台异步进行快照操做,快照同时还能够响应客户端请求。能够经过lastsave命令获取最后一次成功执行快照的时间。架构
在必定间隔时间作一次备份,因此若是redis意外down掉的话,就会丢失最后一次快照后的全部修改app
以日志的形式来记录每一个写操做,将Redis执行过的全部写指令记录下来(读操做不记录),只许追加文件但不能够改写文件,redis启动之初会读取该文件从新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工做异步
AOF采用文件追加方式,文件会愈来愈大为避免出现此种状况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留能够恢复数据的最小指令集.可使用命令bgrewriteaof。性能
AOF持久化方式记录每次对服务器写的操做,当服务器重启的时候会从新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操做到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大spa
在这种状况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,由于在一般状况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.日志
RDB的数据不实时,同时使用二者时服务器重启也只会找AOF文件。那要不要只使用AOF呢?做者建议不要,由于RDB更适合用于备份数据库(AOF在不断变化很差备份),快速重启,并且不会有AOF可能潜在的bug,留着做为一个万一的手段。
由于RDB文件只用做后备用途,建议只在Slave上持久化RDB文件,并且只要15分钟备份一次就够了,只保留save 900 1这条规则。若是Enalbe AOF,好处是在最恶劣状况下也只会丢失不超过两秒数据,启动脚本较简单只load本身的AOF文件就能够了。代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程当中产生的新数据写到新文件形成的阻塞几乎是不可避免的。只要硬盘许可,应该尽可能减小AOF rewrite的频率,AOF重写的基础大小默认值64M过小了,能够设到5G以上。默认超过原大小100%大小时重写能够改到适当的数值。若是不Enable AOF ,仅靠Master-Slave Replication 实现高可用性也能够。能省掉一大笔IO也减小了rewrite时带来的系统波动。代价是若是Master/Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个。新浪微博就选用了这种架构