每当Redis-Server接收到写数据时,就把命令以文本形式追加到AOF文件里,当重启Redis服务时,AOF文件里的命令会被重新执行一次,重新恢复数据。当AOF过大时将重写AOF文件。

  1. > lpush list 1 2 3 4
  2. (integer) 4
  3. 127.0.0.1:6379> lrange list 0 -1
  4. 1) "4"
  5. 2) "3"
  6. 3) "2"
  7. 4) "1"
  8. 127.0.0.1:6379> lpop list
  9. "4"
  10. 127.0.0.1:6379> lrange list 0 -1
  11. 1) "3"
  12. 2) "2"
  13. 3) "1"

appendonly.aof文件中

  1. *2
  2. $6
  3. SELECT
  4. $1
  5. 0
  6. *6
  7. $5
  8. lpush
  9. $4
  10. list
  11. $1
  12. 1
  13. $1
  14. 2
  15. $1
  16. 3
  17. $1
  18. 4
  19. *2
  20. $4
  21. lpop
  22. $4
  23. 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文件重写。

AOF原理

在redis.conf文件中

  1. appendonly no #写成yes,打开AOF持久化
  1. # appendfsync always
  2. appendfsync everysec # 默认
  3. # appendfsync no
  1. alaws:总是同步到AOF文件,每一个命令都写入,安全,速度慢
  2. everysec:每秒写入一次,安全性好,最多丢失1秒钟的数据
  3. no:写入AOF文件工作交给操作系统,由操作系统写入AOF文件,安全性一般

aof文件目录通过RDB文件目录,他们共享同一个目录

  1. dir ./
  2. appendfilename "appendonly.aof"

通过config set dir {newDir} 动态修改dir配置

通过config set dbfilename {appendfilename} 动态修改AOF文件名称

AOF文件过大时,Redis将fork()一个子进程对内存数据进行比那里逆化成Redis命令,序列化文本格式后写入到新的AOF文件中。然后将重写时发生的增量AOF文件追加到新的AOF文件中,最后替换旧的AOF文件。

  1. auto-aof-rewrite-percentage 100 # 比上次重写时文件增大了100%就重写AOF文件
  2. auto-aof-rewrite-min-size 64mb # AOF文件至少超过为64M时重写AOF文件

自动重写必须满足:当前AOF文件大小 > auto-aof-rewrite-min-size &&(当前文件AOF文件大小减去上次重写时AOF文件大小)除以 上次重写时AOF文件大小 = auto-aof-rewrite-percentage

  1. > bgrewriteaof
  2. Background append only file rewriting started
  1. 比RDB文件可靠,everysec模式下只丢1秒数据。
  2. AOF文件为纯文本文件。文件协议格式容易恢复成Redis命令。
  3. AOF文件太大会进行自动重写。
  1. 同等数据下,比RDB文件大。
  2. 同步过程中Redis主进程会被阻塞,everysec是个折中方案。

Redis读取AOF文件数据还原过程

  1. 创建一个不带网络的客户端
  2. 读取AOF文件内容,还原成命令
  3. 将命令在1中的客户端执行
  4. 重复2,3的过程

本人深知水平有限,欢迎指正本文错误之处。


logo

版权声明:本文为imeng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/imeng/p/11341006.html