每当Redis-Server接收到写数据时,就把命令以文本形式追加到AOF文件里,当重启Redis服务时,AOF文件里的命令会被从新执行一次,从新恢复数据。当AOF过大时将重写AOF文件。redis
> lpush list 1 2 3 4 (integer) 4 127.0.0.1:6379> lrange list 0 -1 1) "4" 2) "3" 3) "2" 4) "1" 127.0.0.1:6379> lpop list "4" 127.0.0.1:6379> lrange list 0 -1 1) "3" 2) "2" 3) "1"
appendonly.aof文件中数据库
*2 $6 SELECT $1 0 *6 $5 lpush $4 list $1 1 $1 2 $1 3 $1 4 *2 $4 lpop $4 list
能够看到上面的示例中写操做有lpush和lpop命令,在AOF文件中存在lpush和lpop。SELECT命令为AOF程序自动加上的选择数据库。安全
AOF命令写入的内容为文本协议格式,如:命令lpush list 1 2 3 4 的文本形式为"*6\r\n$5\r\nlpushr\n$4r\nlist\r\n$1\r\n1$1\r\n2$1\r\n3$1\r\n4\r\n"。将文本内容追加到aof_buf(缓冲区)中,AOF缓冲区根据相应的策略同步写入AOF文件中,当AOF文件愈来愈大时,将AOF文件重写。网络
在redis.conf文件中app
appendonly no #写成yes,打开AOF持久化
# appendfsync always appendfsync everysec # 默认 # appendfsync no
aof文件目录经过RDB文件目录,他们共享同一个目录操作系统
dir ./ appendfilename "appendonly.aof"
经过config set dir {newDir}
动态修改dir配置code
经过config set dbfilename {appendfilename}
动态修改AOF文件名称blog
AOF文件过大时,Redis将fork()一个子进程对内存数据进行比那里逆化成Redis命令,序列化文本格式后写入到新的AOF文件中。而后将重写时发生的增量AOF文件追加到新的AOF文件中,最后替换旧的AOF文件。进程
auto-aof-rewrite-percentage 100 # 比上次重写时文件增大了100%就重写AOF文件 auto-aof-rewrite-min-size 64mb # AOF文件至少超过为64M时重写AOF文件
自动重写必须知足:当前AOF文件大小 > auto-aof-rewrite-min-size &&(当前文件AOF文件大小减去上次重写时AOF文件大小)除以 上次重写时AOF文件大小 = auto-aof-rewrite-percentage内存
> bgrewriteaof Background append only file rewriting started
Redis读取AOF文件数据还原过程
本人深知水平有限,欢迎指正本文错误之处。