一、rdb(Redis DataBase)redis
当知足条件时,redis单独会fork(建立)一个新的线程,会先将内存中的数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次已经持久化好了的文件,整个过程当中,主进程是不进行任何IO操做的,确保了极高的性能,此时的主进程还能够进行读写操做。rdb数据持久化的缺点是最后一次持久化的数据可能丢失,当在最后一次持久化的时间截点内尚未持久化,此时机器宕机了或出故障了,那么最后一次的数据就没有持久化到。spring
Fork:fork的做用是复制一个与当前进程同样的进程,新进程的全部数据(变量、环境变量、程序计数器等)数值都和原进程一致,可是是一个全新的进程,也称为原进程的子进程。数据库
若是的内存中的数据量很是大的时候,rdb持久化的临时文件就会很是大,几乎是原文件的1倍,性能有所下降。tomcat
若是当写操做要马上持久化的时候,能够执行命令:saveapp
save是全阻塞的,bgsave是异步的。异步
flushall也会产生dump.rdb文件,清空全部数据库的数据,并保存在dump.rdb文件中。性能
shutdown也会产生dump.rdb文件,将内存中数据保存在dump.rdb文件中线程
二、aof(Append Only File)3d
aof的持久化:blog
aof是对redis的全部写操做的命令将他保存在.aof文件中,包括flushall和flushdb命令也会。当你flushall后,shuntdown了以后重启redis,keys *的数据是空的,由于.aof文件的最后一个写操做的语句是flushall,即便前面作了不少写操做,flushall后,前面的数据都没了。
当aof和rdb同时存在时,会加载aof文件,假如aof文件的语法有误,启动redis是会报错了,就如spring配置文件的bean错了,tomcat也会启动不了。rdb文件也是。
若是aof或rdb文件语法有误,可使用上面两条命令来修复。
aof修复命令:redis-check-aof --fix appendonlly.aof
rdb修复命令:redis-check-rdb--fix dump.rdb
aof是采用文件追加方式,将全部的写操做保存在aof文件中,当文件愈来愈大时,有可能存在相同的写操做,这些相同的操做能够将他浓缩为一条操做,这样能够减小aof文件的容量。
redis对aof新增了一种重写机制,当aof文件大小超过所设定的阈值时,redis会启动aof文件的内容压缩,只保留能够恢复数据的最小指令集,可使用命令bgrewriteaof。
rewrite的原理:主进程会fork出一条新的进程对文件重写,遍历新进程的内存数据,每条记录有一条set语句。重写aof文件的操做并无读取旧的aof文件,而是将整个内存的数据内容用命令的方式重写了一个新的aof文件。
触发rewrite的机制:redis会记录上一次重写时aof文件的大小,默认配置是当aof文件大小是上次rewrite后大小的一倍且文件大于64mb时触发。若是启动redis后没有发生重写的,记录aof文件的大小就启动时加载的aof文件大小。