首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

《Redis源码学习札记》AOF

2013-10-22 
《Redis源码学习笔记》AOF《Redis源码学习笔记》文章列表由于图片较大,缩放较为模糊,请双击打开查看原图 ^_^Re

《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协议

热点排行