如何通过日志先行原则保障数据持久化: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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 步:在新从库服务器上…