前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从源码看redis的AOF持久化机制

从源码看redis的AOF持久化机制

作者头像
爬蜥
发布2020-04-22 11:19:05
4410
发布2020-04-22 11:19:05
举报

AOF持久化就是把命令按照原始的文本存储到文件中,在重新启动的时候再一条条的执行。

AOF存储结构

比如命令 set msg hello :

  1. 首先写入的就是 3,然后追加 \r\n
  2. 遍历每个字符,先写下$符号,然后记下这个字符的长度,追加 \r\n再记下长度和字符本身,然后追加 \r\n
  3. set msg hello 最终需要追加的内容为 3\r\n3\r\nmsg\r\n5\r\nhello\r\n

AOF文件过大的问题

AOF文件本身记录了很多的命令,但是随着时间流逝,可能很多命令都重复了,redis可以通过手动 bgrewriteaof或者配置自动执行 AOF重写来精简AOF文件

AOF相关源码追踪

AOF存储格式

代码语言:javascript
复制
Code.SLICE.source("buf[0] = '*';" +
"    len = 1+ll2string(buf+1,sizeof(buf)-1,argc);" +
"    buf[len++] = '\r';" +
"    buf[len++] = '\n';" +
"    dst = sdscatlen(dst,buf,len);" +
"    for (j = 0; j < argc; j++) {" +
"        o = getDecodedObject(argv[j]);" +
"        buf[0] = '$';" +
"        len = 1+ll2string(buf+1,sizeof(buf)-1,sdslen(o->ptr));" +
"        buf[len++] = '\r';" +
"        buf[len++] = '\n';" +
"        dst = sdscatlen(dst,buf,len);" +
"        dst = sdscatlen(dst,o->ptr,sdslen(o->ptr));" +
"        dst = sdscatlen(dst,\"\r\n\",2);" +
"        decrRefCount(o);" +
"    }")
.interpretation("按照一定的格式转化命令,放到要存放的目的地")
.interpretation("1: 先计算命令一共有几个字符 ,比如命令 set msg hello ,那么首先写入的就是 3,然后追加 \r\n")
.interpretation("2: 遍历每个字符,先写下$符号,然后记下这个字符的长度,追加 \r\n再记下长度和字符本身,然后追加 \r\n")
.interpretation("3: set msg hello 最终需要追加的内容为  3\r\n$3\r\nmsg\r\n$5\r\nhello\r\n");
复制代码

启动加载

代码语言:javascript
复制
 //..
Code.SLICE.source("while(1) ")
    .interpretation("读取AOF文件的内容,按照 REPL 的格式 ,1条条命令处理");
//..
Code.SLICE.source("if (fgets(buf,sizeof(buf),fp) == NULL)")
    .interpretation("从文件中读取一定字节到buf中");
//..
Code.SLICE.source("argc = atoi(buf+1);")
    .interpretation("拿到命令的长度");
//..
Code.SLICE.source("for (j = 0; j < argc; j++) ")
    .interpretation("一个个的解析这条命令的所有数据,中间会对写入的数据做校验");
//..
Code.SLICE.source("argv[j] = createObject(OBJ_STRING,argsds);")
    .interpretation("将数据存储到argv数组");
//..
Code.SLICE.source("cmd = lookupCommand(argv[0]->ptr);")
    .interpretation("确保要执行的命令是合法的redis命令");
//..
Code.SLICE.source("cmd->proc(fakeClient);")
    .interpretation("模拟执行");

AOF的优势

能实现秒级的实时持久化

总结

  1. 每个命令执行完后会按照命令原始的文本被追加到内存中,后续"等待"机会再写入磁盘;
  2. redis会根据配置定时的将数据写入磁盘
  3. 重写就是把当前内存所有的数据1条条的写到新的临时文件,最后在serverCron中重定向到 AOF 文件中,重写过程是异步的
  4. 加载AOF也就是一条条的执行所有命令
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020年04月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • AOF存储结构
  • AOF文件过大的问题
  • AOF相关源码追踪
    • AOF存储格式
      • 启动加载
      • AOF的优势
      • 总结
      相关产品与服务
      云数据库 Redis
      腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档