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.pswp.cn/news/211967.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211967.shtml
英文地址,請注明出處:http://en.pswp.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持久化的博文和視頻大多數都只有改造限流部分的教程,并且都需要修改前端,略顯麻煩,至于剩下的熔斷、熱點流控、授權的更是沒有相關的改造教程,最后在知乎的看到一篇文章后讓…

百科詞條可以刪除嗎?如何刪除自己的百度百科?

近日,小馬識途營銷顧問接到不少客戶刪除自己百科詞條的咨詢,有不少人自己并沒有去建立百科詞條,但是網上已經有了,有的信息不正確,甚至有的信息是負能量的,對當事人自己造成一定的困擾,所以尋求…