如何通過日志先行原則保障數據持久化:Redis AOF 和 MySQL redo log 的對比

在分布式系統或數據庫管理系統中,日志先行原則(Write-Ahead Logging,WAL) 是確保數據一致性、持久性和恢復能力的重要機制。通過 WAL,系統能夠在發生故障時恢復數據,保證數據的可靠性。在這篇博客中,我們將深入探討 Redis AOFMySQL redo log 是如何應用日志先行原則,解決內核 Page Cache 的問題,并避免日志文件無限增大的。

🚩 日志先行原則:保障數據正確落盤

日志先行原則的核心思想是:數據操作的記錄要先寫入日志文件,然后才執行實際的數據操作。這種做法的目的不僅僅是為了確保數據操作的 順序性,而且也為系統 崩潰恢復 提供了保障。通過日志文件,系統可以在崩潰之后,通過重放日志中的操作,恢復到崩潰前的狀態。

內核 Page Cache 的作用

操作系統為了提升磁盤 I/O 性能,引入了 Page Cache(頁面緩存)。當數據被寫入磁盤時,它并不是立刻寫到磁盤上的,而是先緩存到 內存中,然后操作系統會周期性地將內存中的數據刷新到磁盤。這種機制能顯著提升寫操作的效率,但它帶來了一些潛在問題,尤其是對于持久化系統的可靠性。

日志先行原則解決的核心問題

為了確保數據能夠 可靠地落盤,即使操作系統的緩存機制(Page Cache)發生問題,日志文件的記錄能夠作為保證,防止數據丟失。這是 WAL 原則的核心:我們將數據的修改首先寫入日志文件,在日志文件被成功寫入之后,才允許數據操作執行。這意味著,數據是否持久化到磁盤由 日志文件 控制,而不僅僅依賴操作系統的緩存機制。


🚩 Redis AOF 持久化:重寫機制避免日志文件無限增大

Redis 是一個內存數據存儲系統,默認情況下,數據存儲在內存中并通過內存操作來提供高性能的讀寫服務。然而,Redis 同時也提供了 AOF(Append-Only File)持久化機制,以確保數據在重啟或崩潰后不會丟失。

AOF 重寫:精簡日志文件

Redis AOF 的工作機制也遵循了 日志先行原則,即每次寫操作都會先被記錄到 AOF 文件中,然后才進行實際的內存操作。為了避免 AOF 文件的無限增大,Redis 引入了 AOF 重寫機制

AOF 重寫的過程
  1. 當 Redis 執行寫操作時,命令會被追加到 AOF 文件。
  2. 隨著時間的推移,AOF 文件會逐漸增大,因為每個操作都會記錄在文件中。為了解決這個問題,Redis 會定期進行 AOF 重寫
  3. 在 AOF 重寫過程中,Redis 會在后臺創建一個新的 AOF 文件,并將當前內存中的數據生成一份 精簡版的寫操作記錄,去除冗余的命令(例如多個連續的 SET 操作可以合并為一個 MSET 操作)。
  4. 重寫完成后,舊的 AOF 文件會被替換為新的文件,釋放磁盤空間。
舉個例子

假設你有一個鍵 user:123,并且對它執行了多個 SET 操作,如下:

SET user:123 name "John"
SET user:123 age 30
SET user:123 city "New York"

這些操作會被按順序追加到 AOF 文件中。如果不進行重寫,AOF 文件將會不斷增加。但通過 AOF 重寫,Redis 會把這三條 SET 命令合并為一條:

MSET user:123 name "John" age 30 city "New York"

這樣 AOF 文件的大小就得到了有效壓縮。


🚩 MySQL redo log:循環使用已有的日志文件

MySQL 的 redo log 采用了 日志先行原則,它主要用于保證事務的持久化,確保在系統崩潰后能通過重做日志恢復數據。MySQL 的 redo log 與 Redis 的 AOF 有相似的目的,都是為了解決 數據丟失 問題。

Redo log 循環使用:避免日志文件增大

MySQL 使用的 redo log 是一個循環寫入的日志系統,當日志文件寫滿時,MySQL 會 覆蓋舊的日志文件,而不是不斷增加新的文件。這樣可以有效避免日志文件無休止增大。

redo log 的工作機制
  1. 每個事務的修改會先記錄到 redo log 中,并通過 InnoDB 存儲引擎持久化到磁盤。
  2. redo log 文件是循環使用的,MySQL 在寫滿一個日志文件后,會將新的日志寫入下一個文件,并重新覆蓋最早的日志文件。
  3. 文件增大問題:通過這種方式,MySQL 確保日志文件不會不斷增加,同時也確保事務的持久化。

日志文件回收

日志文件寫滿 時,MySQL 會自動回收日志文件,保證不會無限制地占用磁盤空間。通過這個機制,MySQL 能夠確保即使在高并發的環境下,日志文件始終保持在一個合理的大小范圍內。


🚩 總結:日志先行原則保障數據落盤

無論是 Redis AOF 還是 MySQL redo log,它們都通過 日志先行原則 來保證數據在落盤之前不會丟失。這不僅僅是為了確保數據的一致性和持久性,還能有效應對操作系統的 Page Cache 所帶來的潛在問題。

關鍵點:

  • 日志先行原則 保障了數據在磁盤上持久化之前不會丟失。
  • Redis 通過 AOF 重寫機制,在數據成功落盤后清理舊的日志文件,避免文件無限增大。
  • MySQL 的 redo log 則通過 循環使用日志文件 來解決日志文件增大的問題。

通過這些機制,Redis 和 MySQL 都能在確保高性能的同時,避免日志文件無限增長,保持系統的可靠性和穩定性。


希望這篇博客能夠幫助你更好地理解 Redis 和 MySQL 中的日志管理機制。如果你有任何問題或需要進一步的解釋,歡迎在評論區留言!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95770.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95770.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95770.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

臨床研究三千問——臨床研究體系的3個維度(8)

在上周的文章中,我們共同探討了1345-10戰策的“臨床研究的起點——如何提出一個犀利的臨床與科學問題”。問題固然是靈魂,但若沒有堅實的骨架與血肉,靈魂便無所依歸。今天,我們將深入“1345-10戰策”中的“3”,即支撐起…

AI+預測3D新模型百十個定位預測+膽碼預測+去和尾2025年9月7日第172彈

從今天開始,咱們還是暫時基于舊的模型進行預測,好了,廢話不多說,按照老辦法,重點8-9碼定位,配合三膽下1或下2,殺1-2個和尾,再殺4-5個和值,可以做到100-300注左右。(1)定位…

萬字詳解網絡編程之socket

一,socket簡介1.什么是socketsocket通常也稱作"套接字",?于描述IP地址和端?,是?個通信鏈的句柄,應用程序通常通過"套接字"向?絡發出請求或者應答?絡請求。?絡通信就是兩個進程間的通信,這兩…

維度躍遷:當萬物皆成電路,智能將從“擁有”變為“存在”

我們習以為常的電子世界,其本質是一個由電路構成的精密宇宙。而一場從二維到三維的終極變革,正在悄然醞釀,它將徹底顛覆我們創造和交互的方式。一、電子世界的本質:一切都是電路 在深入未來之前,我們首先要理解當下。電…

大語言模型預訓練數據采集與清洗技術實踐:從語料到知識庫的全流程優化

大語言模型(LLM)的性能上限由 “數據質量 數據規模 數據多樣性” 共同決定 —— 預訓練階段的海量語料決定模型的泛化能力與語言理解基礎,而知識庫數據則決定模型的知識準確性與領域專業性。當前 LLM 落地面臨的核心痛點之一,便是 “數據臟、處理難、知識雜”:預訓練語料…

模擬音頻采集設備的制作

模擬音頻程序與設備的制作 需要設備 esp32s3 pcm1808 pcm5102(非必須) 程序界面 程序代碼 代碼鏈接

Java Modbus通信實戰(四):Modbus通信測試與故障排查

在工業現場,設備通信系統就像工廠的神經網絡,連接著各種傳感器、控制器和執行器。當你搭建好這套系統后,最關鍵的一步就是全面測試,確保每個環節都能正常工作。 就像汽車出廠前要經過嚴格的路試一樣,Modbus RTU通信系統…

少兒編程C++快速教程之——1. 基礎語法和輸入輸出

1. 歡迎來到C編程世界! 1.1 什么是編程? 編程就像是給計算機寫一份詳細的"說明書",告訴它該做什么、怎么做。C是一種強大的編程語言,可以用來創建游戲、應用程序和各種有趣的軟件! 1.2 第一個C程序&#xff…

arma::imat22

arma::imat22 是 Armadillo C 線性代數庫中定義的一個固定大小的 2x2 有符號整數矩陣類型。它主要用于處理小型、維度在編譯時已知的整數矩陣,因其在棧上分配內存,故通常比動態矩陣有更高的效率。 下面是一個匯總了 arma::imat22 主要特性的表格&#xf…

狗都能看懂的HunYuan3D 1.0詳解

HunYuan3D 1.0 HunYuan3D 1.0是2024年9月發布的一篇論文。雖然站在現在的時間節點,HunYuan3D系列已經出到2.5了,但是1.0版本的改進思路,和它trick集成的做法,還是很值得學習的。由于文章用到了很多技術,由于篇幅有限&a…

踏腳邁入奇幻樂園

每天早上上班的路上都會經過一個小花園。它被夾在丁字路口的拐角,面積不大,匆匆而過的行人都不會注意到它。但如果順著幾個不起眼的入口走進去,里面卻是別有洞天。清早的街道還沒有車水馬龍的喧嘩,花園里靜悄悄的。各式各樣的花草…

內存越界引發線程函數調用堆棧回溯異常以及INT 3軟中斷實戰分析案例分享

目錄 1、問題說明 2、導出dump文件時只是遇到了INT 3軟中斷,并沒有發生異常崩潰 3、函數中發生了棧內存越界,導致線程的棧回溯出異常,堆棧中只顯示一行函數調用記錄 3.1、處理Json數據時產生了異常 3.2、函數中發生棧內存越界&#xff0…

LeetCode 240: 搜索二維矩陣 II - 算法詳解(秒懂系列

文章目錄LeetCode 240: 搜索二維矩陣 II - 算法詳解題目描述Java解決方案算法思路核心理念為什么選擇右上角?可視化演示過程示例1:查找 target 5示例2:查找 target 20 (不存在)算法分析時間復雜度空間復雜度算法優勢關鍵要點擴展思考LeetCo…

洛谷 B4071 [GESP202412 五級] 武器強化

思考難度低,但是代碼難度相對較高的題,故做個記錄。首先,題目說了要花費最少的錢,所以我們每次拿最便宜的材料給武器1思想:每次都拿最便宜的材料然后考慮一下這個思想是否正確,找一下反例,每次拿…

SQL工具30年演進史:從Oracle到Navicat、DBeaver,再到Web原生SQLynx

目錄 一、1990s:廠商自帶的數據庫工具時代 二、2000s:Navicat等商業數據庫管理工具崛起 三、2010s:DBeaver等開源SQL工具興起 四、2020s:SQLynx,Web原生數據庫管理工具 五、SQL工具30年時間線對比 六、總結&…

C語言制作掃雷游戲(拓展版賦源碼)

目錄 引言: 三個新功能實現 1.可以選擇難度或自定義 實現難點解析 代碼實現(附源碼) 掃雷.c game.h game.c 2.對選擇位置進行標記或取消標記 一.框架 我們先理一下思路 如何構造框架 二.取消標記函數 三.標記函數 四.加入清屏,進…

Python快速入門專業版(十):字符串特殊操作:去除空格、判斷類型與編碼轉換

目錄引1.去除空格:清理字符串的實用技巧1.1 三類去空格方法:strip()、lstrip()、rstrip()1.2 實戰案例:處理用戶輸入的空格問題2.判斷類型:驗證字符串內容的特性2.1 常用類型判斷方法2.2 實戰案例:驗證用戶輸入的合法性…

Gamma AI:AI演示文稿制作工具,高效解決PPT框架搭建難與排版耗時問題

你做 PPT 的時候是不是也常陷入 “兩難”?要么對著空白幻燈片發呆,不知道怎么搭框架 —— 比如要做 “產品季度迭代復盤”,既想放數據又想講問題,結果頁面堆得像亂燉;要么好不容易湊完內容,又花兩小時調排版…

【應用案例】AI 給醫用過濾器 “找茬”:3 大難點 + 全流程解決方案

【應用案例】AI 給醫用過濾器 “找茬”:3 大難點 全流程解決方案🎯醫用過濾器進行醫療AI檢測🎯先看痛點:醫用過濾器檢測難在哪?🎯AI檢測方案:3步實現“零漏檢”1. 硬件定制:讓缺陷“…

【數據庫相關】TxSQL新增數據庫節點步驟

TxSQL新增數據庫節點步驟準備工作與注意事項具體操作步驟第 1 步:在主庫上創建復制專用賬號第 2 步:對主庫進行鎖表并獲取二進制日志坐標第 3 步:備份主庫數據并傳輸到新從庫第 4 步:主庫解鎖第 5 步:在新從庫服務器上…