与RDB通过记录数据库的键值对来记录数据库状态不同,AOP持久化是通过保存Redis服务器执行的命令
AOP持久化的实现分为命令追加(append),文件写入,文件同步三个步骤
服务器执行往一个命令后,会追加到aop_buf缓冲区的末尾
在现代操作系统中,当用户调用write函数将数据写入文件中,通常会保存在内存缓冲区中,等到缓冲区满,或超过指定时间才真正写入磁盘
数据库只要重启的时候再执行一次命令即可复原数据
AOF重写,节省空间
通过读取数据库当前的状态
例如:
redis>RPUSH list "A" "B" //{"A","B"}
(integer)2
redis>RPUSH list "C" //{"A","B","C"}
(integer)3
redis>RPUSH list "D" "E" //{"A","B","C","D","E"}
(integer)5
redis>LPOP list //{"A","B","C","D"}
(integer)"A"
redis>LPOP list //{"A","B","C"}
(integer)"D"
redis>RPUSH list "F "G" //{"A","B","C","F","G"}
(integer)5
那么在重写的AOF中可以使用RPUSH list "A" "B" "C" "F" "G"代替
在AOF重写中,是在后台开启子线程 进行操作的
但是在子线程执行的期间,很可能数据又被改动,因此为了解决数据不一致,又设置了一个AOF重写缓存区
也就是说在AOF重写期间,服务器进行执行命令要执行以下三个工作:
- 执行客户端发来的命令
- 将执行后的命令追加到AOP缓冲区
- 将执行后的命令追加到AOF重写缓冲区
当重写完毕后,重写的AOF会覆盖没有重写的AOP