Redis AOF源码解析

本文取3.0版本分析(各个版本差异很大,4.0以上才有aof和rdb混合模式)

触发时机

        1、bgrewriteaofCommand函数触发,即在Redis server服务上运行bgrewriteaof命令。

        1-1、当前已经有 AOF 重写的子进程正在执行,重复执行bgrewriteaof命令,是不会执行bgrewriteaof命令。

        1-2、执行rewriteAppendOnlyFileBackground函数。

        2、rewriteAppendOnlyFileBackground函数触发:

        2-1、当前没有aof子进程和rdb子进程,但是存在着等待执行任务调度的aof命令,只有到了执行任务调度aof命令的情况下,才会触发aof重写。

        2-2、当前没有aof子进程和rdb子进程,但是设置了aof阈值的情况,如果当前aof文件超过了预留的阈值,则会触发aof重写。

        3、开启Redis server aof配置功能

        3-1、当用户在运行时使用config命令,从 appendonly no 切换到 appendonly yes 时执行。

        3-2、执行rewriteAppendOnlyFileBackground函数。

        4、主从复制函数readSyncBulkPayload,startAppendOnly函数

        4-1、主从复制开启aof配置功能下,如果有rdb子进程,那么等待rdb子进程处理完后,再通过任务调度执行aof持久化,如果有aof进程,强制kill掉正在执行的aof子进程,重新生成aof持久化文件。

生成aof文件过程

挺复杂的,后面继续研究

/* This is how rewriting of the append only file in background works:* * 以下是后台重写 AOF 文件(BGREWRITEAOF)的工作步骤:** 1) The user calls BGREWRITEAOF*    用户调用 BGREWRITEAOF** 2) Redis calls this function, that forks():*    Redis 调用这个函数,它执行 fork() :**    2a) the child rewrite the append only file in a temp file.*        子进程在临时文件中对 AOF 文件进行重写**    2b) the parent accumulates differences in server.aof_rewrite_buf.*        父进程将新输入的写命令追加到 server.aof_rewrite_buf 中** 3) When the child finished '2a' exists.*    当步骤 2a 执行完之后,子进程结束** 4) The parent will trap the exit code, if it's OK, will append the*    data accumulated into server.aof_rewrite_buf into the temp file, and*    finally will rename(2) the temp file in the actual file name.*    The the new file is reopened as the new append only file. Profit!**    父进程会捕捉子进程的退出信号,*    如果子进程的退出状态是 OK 的话,*    那么父进程将新输入命令的缓存追加到临时文件,*    然后使用 rename(2) 对临时文件改名,用它代替旧的 AOF 文件,*    至此,后台 AOF 重写完成。*/
int rewriteAppendOnlyFileBackground(void) {pid_t childpid;long long start;// 已经有进程在进行 AOF 重写了if (server.aof_child_pid != -1) return REDIS_ERR;// 记录 fork 开始前的时间,计算 fork 耗时用start = ustime();if ((childpid = fork()) == 0) {char tmpfile[256];/* Child */// 关闭网络连接 fdcloseListeningSockets(0);// 为进程设置名字,方便记认redisSetProcTitle("redis-aof-rewrite");// 创建临时文件,并进行 AOF 重写snprintf(tmpfile,256,"temp-rewriteaof-bg-%d.aof", (int) getpid());if (rewriteAppendOnlyFile(tmpfile) == REDIS_OK) {size_t private_dirty = zmalloc_get_private_dirty();if (private_dirty) {redisLog(REDIS_NOTICE,"AOF rewrite: %zu MB of memory used by copy-on-write",private_dirty/(1024*1024));}// 发送重写成功信号exitFromChild(0);} else {// 发送重写失败信号exitFromChild(1);}} else {/* Parent */// 记录执行 fork 所消耗的时间server.stat_fork_time = ustime()-start;if (childpid == -1) {redisLog(REDIS_WARNING,"Can't rewrite append only file in background: fork: %s",strerror(errno));return REDIS_ERR;}redisLog(REDIS_NOTICE,"Background append only file rewriting started by pid %d",childpid);// 记录 AOF 重写的信息server.aof_rewrite_scheduled = 0;server.aof_rewrite_time_start = time(NULL);server.aof_child_pid = childpid;// 关闭字典自动 rehashupdateDictResizePolicy();/* We set appendseldb to -1 in order to force the next call to the* feedAppendOnlyFile() to issue a SELECT command, so the differences* accumulated by the parent into server.aof_rewrite_buf will start* with a SELECT statement and it will be safe to merge. ** 将 aof_selected_db 设为 -1 ,* 强制让 feedAppendOnlyFile() 下次执行时引发一个 SELECT 命令,* 从而确保之后新添加的命令会设置到正确的数据库中*/server.aof_selected_db = -1;replicationScriptCacheFlush();return REDIS_OK;}return REDIS_OK; /* unreached */
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/211967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript-Window对象

Window对象 BOM:浏览器对象模型 定时器-延时函数 JavaScript内置的一个用来让代码延迟执行的函数,setTimeout setTimeout(回调函数,等待的毫秒数);setTimeout仅仅只执行依次,所以可以理解为就是把一段代码延迟执行&#xff0c…

网络协议疑点记录

1.RIP, OSPF,BGP 首先什么是自治系统:治系统就是几个路由器组成了一个小团体 ?,小团体内部使用专用的协议进行通信,而小团体和小团体之间也使用专用的协议进行通信。 IGP RIP 距离矢量路由算法,bellman-ford算法,每个路由节点知道全局的路由信息,通过和邻居交换信息得…

五.单行函数

单行函数 1.函数的理解1.1什么是函数1.2不同DBMS函数的差异1.3MySQL的内置函数分类 2.数值函数2.1基本函数2.2角度与弧度互换函数2.3三角函数2.4指数与对数2.5进制间的转换 3.字符串函数4.日期和时间函数4.1获取日期、时间4.2日期与时间戳的转换4.3获取月份、星期、星期数、天数…

perl处理base64、md5、SHA-1、SHA-256的计算

使用perl可以进行base64、md5、SHA-1、SHA-256的计算,使用也非常方便,下面是示例代码: #! /usr/bin/perl use v5.14; use MIME::Base64; use Digest;my $test_str hello world;# 测试base64 say encode_base64($test_str);# 测试md5 my $md…

【Copilot】Edge浏览器的copilot消失了怎么办

这种原因,可能是因为你的ip地址的不在这个服务的允许范围内。你需要重新使用之前出现copilot的ip地址,然后退出edge的账号,重新登录一遍,最后重启edge,就能够使得copilot侧边栏重新出现了。

【已解决】ModuleNotFoundError: No module named ‘pandas‘

问题描述 ModuleNotFoundError: No module named ‘pandas’ 解决办法 pip install pandas 完结撒花 熟悉的人相遇,就像久旱等到的甘霖

计算机基础知识66

Auth的补充 #概念:是django 的一个app,关于用户的登录,退出,注册... # 配置文件中配置:表会被迁移 INSTALLED_APPS [django.contrib.auth,] # auth有哪些表---权限控制: Permission:auth_permi…

Java 中连接 SQL 数据库

在 Java 中,连接 SQL 数据库通常使用 JDBC(Java Database Connectivity)。以下是使用 IntelliJ IDEA 连接 SQL 数据库的一般步骤: 1. 引入 JDBC 驱动:首先,你需要下载并引入与你所使用的数据库相对应的 JD…

Linux 导入、导出 MySQL 数据库命令

一、导出数据库 1、导出完整数据:表结构数据 mysqldump -u用户名 -p 数据库名 > 数据库名.sql 举例:以下命令可以导出 abc 数据库的数据和表结构 /usr/local/mysql/bin/mysqldump -uroot -p abc > abc.sql2、只导出表结构 mysqldump -u用户名 -p…

用23种设计模式打造一个cocos creator的游戏框架----(十二)状态模式

1、模式标准 模式名称:状态模式 模式分类:行为型 模式意图:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 结构图: 适用于: 1、一个对象的行为决定于它的状态,并且它必须…

【C语言】字符串函数strcpystrcatstrcmpstrstr的使⽤和模拟实现

🌈write in front :🔍个人主页 : 啊森要自信的主页 ✏️真正相信奇迹的家伙,本身和奇迹一样了不起啊! 欢迎大家关注🔍点赞👍收藏⭐️留言📝>希望看完我的文章对你有小小的帮助&am…

OCSP检查数字证书状态详解

文章目录 1. OCSP 的基本原理2. OCSP 的工作流程3. OCSP 的优势和不足4. OCSP Stapling5. OCSP 配置 OCSP(Online Certificate Status Protocol)是一种用于检查数字证书状态的协议。它提供了一种实时查询证书状态的方式,以确定证书是否被吊销…

prototype、__proto__、constructor、原型、原型链

结论: __proto__和constructor属性是对象所独有的; prototype属性是函数所独有的,由于函数也是一种对象,所以函数也拥有__proto__和constructor属性;__proto__属性的作用就是当访问一个对象的属性时,如果该…

C++ 多态性(Polymorphism)和 虚函数(Virtual Functions)

在 C 中,多态性(Polymorphism)是面向对象编程的一个重要概念,它允许通过基类指针或引用来调用派生类对象的特定方法。虚函数(Virtual Functions)是实现多态性的一种机制,通过在基类中声明虚函数…

InputStream和OutputStream速通

InputStream和OutputStream 输入流(InputStream): InputStream是抽象类,用于从各种数据源(如文件、网络连接、内存等)读取字节流。常见的子类包括FileInputStream、ByteArrayInputStream和SocketInputStrea…

电源小白入门学习1——电源系统架构和相关指标

电源小白入门学习1——电源系统架构和相关指标 电源系统架构电源系统的指标及测量方法电源的效率电源的静态电流输出电压调整率纹波测量的注意事项动态负载测试 在开始本期内容之气,我先简单介绍一下我们电源小白学习系列内容:首先我是一个嵌入式小白&am…

【InsCode】新的代码管理工具inscode教程它和Git以及SVN的区别

InsCode 实践分享 InsCodeGitSVN类型代码管理工具分布式版本控制系统集中式版本控制系统分支管理支持强大的分支管理功能,包括创建、合并和删除分支支持分支管理,操作简单快捷支持分支管理,但操作相对复杂代码托管提供代码托管功能&#xff…

在VSCode中运行Python脚本文件时如何传参

以下实验所处的操作系统环境说明: OS版本MacOSMonterey 12.1VSCodeOctober 2023 (version 1.84.2) 一、背景 在 VSCode 中写好 Python 脚本后,如果要运行起来,可以怎么做呢? 一般有以下几种方式: 1、直接在 VSCode…

sentinel整合nacos配置中心持久化

在网上找了很多的资料,发现sentinel整合nacos持久化的博文和视频大多数都只有改造限流部分的教程,并且都需要修改前端,略显麻烦,至于剩下的熔断、热点流控、授权的更是没有相关的改造教程,最后在知乎的看到一篇文章后让…

百科词条可以删除吗?如何删除自己的百度百科?

近日,小马识途营销顾问接到不少客户删除自己百科词条的咨询,有不少人自己并没有去建立百科词条,但是网上已经有了,有的信息不正确,甚至有的信息是负能量的,对当事人自己造成一定的困扰,所以寻求…