redis有两种持久化机制,分别是AOF和RDB,其中AOF是每次增删改操作都会生成一条日志记录,RDB是redis在某一时间点生成的内存镜像。

AOF持久化的配置
AOF持久化默认是关闭的,默认只打开RDB持久化。修改redis.conf文件中的appendonly yes可以打开AOF持久化机制,在生产环境里面,一般来说AOF都是要打开的,除非你说随便丢个几分钟的数据也无所谓。
打开AOF持久化机制之后,redis每次接收到一条写命令,就会写入日志文件中,当然是先写入os cache的,然后每隔一定时间再fsync一下。而且即使AOF和RDB都开启了,redis重启的时候,也是优先通过AOF进行数据恢复的,因为aof数据比较完整。可以配置AOF的fsync策略,有三种策略可以选择,一种是每次写入一条数据就执行一次fsync; 一种是每隔一秒执行一次fsync; 一种是不主动执行fsync。生产环境中一般用默认配置appendfsync everysec

AOF rewrite
因为AOF机制是每次增删改都会插入一条日志记录,所以随着时间的推移这个日志会也来越大,但是redis中的数据会不断淘汰掉旧的,就一部分常用的数据会被自动保留在redis内存中,所以可能很多之前的已经被清理掉的数据,对应的写日志还停留在AOF中,AOF日志文件就一个,会不断的膨胀,到很大很大。所以AOF会自动在后台每隔一定时间做rewrite操作,比如日志里已经存放了针对100w数据的写日志了; redis内存只剩下10万; 基于内存中当前的10万数据构建一套最新的日志,到AOF中; 覆盖之前的老日志; 确保AOF日志文件不会过大,保持跟redis内存数据量一致。redis 2.4之前,还需要手动,开发一些脚本,crontab,通过BGREWRITEAOF命令去执行AOF rewrite,但是redis 2.4之后,会自动进行rewrite操作。在redis.conf中,可以配置rewrite策略。
注意:并不一定大小扩大到原来的两倍就一定去rewrite,它会继续判断min-size是否大于64M,只有这两个调节满足才会rewrite。
比如说上一次AOF rewrite之后,是128mb,然后就会接着128mb继续写AOF的日志,如果发现增长的比例,超过了之前的100%,256mb,就可能会去触发一次rewrite,但是此时还要去跟min-size,64mb去比较,256mb > 64mb,才会去触发rewrite。

AOF破损文件的修复
1、配置
用redis-check-aof --fix命令来修复破损的AOF文件

RDB持久化机制
修改redis.conf文件,配置如下
save 60 1000
意思是,每隔60s,如果有超过1000个key发生了变更,那么就生成一个新的dump.rdb文件,就是当前redis内存中完整的数据快照,这个操作也被称之为snapshotting(快照),
也可以手动调用save或者bgsave命令,同步或异步执行rdb快照生成。save可以设置多个,就是多个snapshotting检查点,每到一个检查点,就会去check一下,是否有指定的key数量发生了变更,如果有,就生成一个新的dump.rdb文件
2、RDB持久化机制的工作流程
(1)redis根据配置自己尝试去生成rdb快照文件
(2)fork一个子进程出来
(3)子进程尝试将数据dump到临时的rdb快照文件中
(4)完成rdb快照文件的生成之后,就替换之前的旧的快照文件

dump.rdb,每次生成一个新的快照,都会覆盖之前的老快