《Redis源码学习笔记》AOF
《Redis源码学习笔记》文章列表
由于图片较大,缩放较为模糊,请双击打开查看原图 ^_^
Redis提供两种持久化方式,RDB和AOF;与RDB不同,AOF可以完整的记录整个数据库,而不像RDB只是数据库某一时刻的快照;
那么AOF模式为什么可以完整的记录整个数据库呢?
原理:在AOF模式下,Redis会把执行过的每一条更新命令记录下来,保存到AOF文件中;当Redis需要恢复数据库数据时,只需要从之前保存的AOF文件中依次读取命令,执行即可 eg.
整个AOF_WRITE过程,最重要的一个函数是: rewriteAppendOnlyFile,它主要做了下面事情:
a. 创建一个临时文件temp-rewriteaof-pid.aof;
b. 循环所有数据库,把每一个数据库中的键值对,按照aof协议写入到临时文件;
c. 重命名临时文件;
伪代码:
def processCommand(cmd, argc, argv): # 执行命令 call(cmd, argc, argv) # 该命令变更了键空间并且AOF模式打开 if redisServer.update_key_space and redisServer.aof_state & REDIS_AOF_ON: feedAppendOnlyFile(cmd, argc, argv) def feedAppendOnlyFile(cmd, argc, argv): # 把命令转换成AOF协议格式 aofCmdStr = getAofProtocolStr(cmd, argc, argv) redisServer.aof_buf.append(aofCmdStr ) # 存在一个子进程正在进行AOF_REWRITE if redisServer.aof_child_pid != -1: # 把变更命写写到aof重写缓存 redisServer.aof_rewrite_buf_blocks.append(aofCmdStr )
你会发现,如果redis检测到有一个子进程正在进行AOF_REWRITE,那么它会把这期间所有变更命令写到AOF重写缓存(aof_rewrite_buf_blocks),然后当子进程完成AOF_REWRITE后,它会再把AOF重写缓存中的内容追加到新生成文件,这样我们就可以保证数据的一致性,避免刚才说的问题发生;
总结:
1. 了解AOF模式作用及原理
2. 了解AOF重写作用及原理
3. 了解AOF协议