WAL机制学习
背景在学习游戏常见场景开发遇到这个概念看目的是为了解决缓存写入数据库的过程失败后未落库的数据能够落地的方案。但是在实际工作中遇到比较少故展开学习。学习目标了解该机制原理应用场景原理WAL 的核心就是先写日志再写数据崩溃后通过回放日志来恢复。一个典型的 WAL 方案包含三个部分日志文件追加写入的文本文件或二进制文件每条记录代表一个操作。写入器负责将操作序列化为日志并刷盘。回放器启动时或崩溃后读取日志与数据库对比执行缺失的操作。关键细节以下用一些示例代码讲解下定义日志记录结构每条日志包含唯一ID、操作类型、时间戳和具体数据。importjsonimportosimportuuidimporttimefromtypingimportCallable,Dict,AnyclassWalRecord:单条WAL记录def__init__(self,op_type:str,data:Dict[str,Any]):self.record_idstr(uuid.uuid4())self.op_typeop_type# 例如 add_friend, remove_friendself.datadata# 例如 {user_id: 1, friend_id: 2}self.timestamptime.time()defto_json(self)-str:returnjson.dumps({id:self.record_id,op:self.op_type,data:self.data,ts:self.timestamp})\nstaticmethoddeffrom_json(line:str)-WalRecord:objjson.loads(line.strip())recWalRecord(obj[op],obj[data])rec.record_idobj[id]rec.timestampobj[ts]returnrecWAL 管理器负责写入、回放和清理。classWalManager:def__init__(self,file_path:str/var/log/friend_wal.log):self.file_pathfile_path self._fileNonedefopen(self):打开日志文件以追加模式self._fileopen(self.file_path,a)# a 可读可追加defclose(self):ifself._file:self._file.close()defappend(self,record:WalRecord):追加一条记录并强制刷盘linerecord.to_json()self._file.write(line)self._file.flush()# 刷新到内核缓冲区os.fsync(self._file.fileno())# 强制刷入磁盘关键defread_all(self)-list:读取所有记录用于回放records[]self._file.seek(0)# 回到文件开头forlineinself._file:ifline.strip():records.append(WalRecord.from_json(line))returnrecordsdeftruncate(self,upto_record_id:str):截断到指定记录之后清理已处理的日志# 简单实现重写文件只保留大于upto_record_id的记录all_recordsself.read_all()keep_records[rforrinall_recordsifr.record_id!upto_record_idandall_records.index(r)all_records.index([xforxinall_recordsifx.record_idupto_record_id][0])]self._file.close()withopen(self.file_path,w)asf:forrecinkeep_records:f.write(rec.to_json())self._fileopen(self.file_path,a)为什么需要 os.fsyncflush() 只是将数据从用户空间缓冲区移到内核缓冲区但内核可能还未写入磁盘。os.fsync() 强制内核将数据刷入物理磁盘确保即使系统掉电也不会丢失。这是 WAL 可靠性的核心。幂等恢复回放时不能简单地重放所有日志因为有些操作可能已经成功写入数据库例如第一次运行正常但后来服务又崩溃了。因此需要先检查数据库中是否已经存在该操作的结果。常见做法使用 INSERT IGNORE 或 ON DUPLICATE KEY UPDATE让数据库自动跳过重复。或者维护一张 processed_log 表记录已处理的日志ID回放时跳过这些ID。日志清理WAL 文件会无限增长需要定期清理。清理策略标记-截断记录一个“安全水位”表示该ID之前的日志都已处理完毕可以删除。分段管理按时间或大小切分文件只保留最近N个文件。使用数据库表代替文件利用数据库自身的清理机制.应用场景MySQL InnoDB 的 Redo LogMySQL 的 InnoDB 存储引擎内部就有 WAL 机制称为 Redo Log。每次事务提交时先写 Redo Log顺序IO再异步刷脏页到数据文件。如果数据库崩溃重启时通过 Redo Log 恢复未写入数据文件的修改。这是 WAL 最经典的工业实现。Kafka 的 Partition LogKafka 的每个分区本质上就是一个 WAL 文件。生产者写入消息时先追加到分区日志顺序写消费者从日志中读取。Kafka 的高吞吐和可靠性正依赖于这种 WAL 设计。RocksDB / LevelDB 的 WALFacebook 开发的 RocksDB用于 MySQL MyRocks 引擎、TiKV 等也有独立的 WAL 文件。每次写入先写 WAL再写 MemTable崩溃后通过 WAL 恢复。分布式系统中的 WALZooKeeper每个事务先写事务日志WAL再更新内存状态。etcd使用 BoltDB 的 WAL 机制保证一致性。TiDB​ 的 TiKV 节点使用 Raft 协议底层也是 WALRaft Log。

相关新闻

Obsidian界面优化:5个CSS代码片段解决你的视觉疲劳问题

Obsidian界面优化:5个CSS代码片段解决你的视觉疲劳问题

Obsidian界面优化:5个CSS代码片段解决你的视觉疲劳问题 【免费下载链接】awesome-obsidian 🕶️ Awesome stuff for Obsidian 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-obsidian Obsidian作为一款强大的知识管理工具,虽然…

2026/7/20 12:40:12阅读更多 →
React Native AdMob社区贡献指南:如何参与开源项目开发与维护

React Native AdMob社区贡献指南:如何参与开源项目开发与维护

React Native AdMob社区贡献指南:如何参与开源项目开发与维护 【免费下载链接】react-native-admob A react-native component for Google AdMob banners 项目地址: https://gitcode.com/gh_mirrors/re/react-native-admob React Native AdMob是一个为React …

2026/7/20 12:40:12阅读更多 →
Steam DLC解锁终极指南:3分钟免费体验完整游戏内容

Steam DLC解锁终极指南:3分钟免费体验完整游戏内容

Steam DLC解锁终极指南:3分钟免费体验完整游戏内容 【免费下载链接】SmokeAPI Legit DLC Unlocker for Steamworks 项目地址: https://gitcode.com/gh_mirrors/smo/SmokeAPI 还在为Steam游戏中的付费DLC内容而烦恼吗?SmokeAPI作为一款专业的Steam…

2026/7/20 12:38:12阅读更多 →
I2C总线时钟同步与仲裁机制深度解析:从原理到嵌入式实践

I2C总线时钟同步与仲裁机制深度解析:从原理到嵌入式实践

1. I2C总线:从两根线开始的嵌入式通信艺术如果你玩过单片机或者嵌入式开发,I2C总线绝对是你绕不开的一个老朋友。它简单到只需要两根线——一根数据线(SDA),一根时钟线(SCL),就能把一…

2026/7/21 6:44:55阅读更多 →
TMS320x2806x DMA配置实战:从原理到电机控制应用

TMS320x2806x DMA配置实战:从原理到电机控制应用

1. 项目概述:为什么我们需要DMA? 在嵌入式系统开发,尤其是像TMS320x2806x这类高性能数字信号控制器(DSC)的应用中,我们常常面临一个核心矛盾:CPU的计算能力很强,但它的时间非常宝贵。…

2026/7/21 6:44:55阅读更多 →
Windows系统文件Docking.VirtualInput.dll丢失找不到问题解决

Windows系统文件Docking.VirtualInput.dll丢失找不到问题解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

2026/7/21 6:44:55阅读更多 →
微服务架构从JDK8升级到JDK17的实践指南

微服务架构从JDK8升级到JDK17的实践指南

1. 微服务架构升级JDK17的必要性与挑战去年我们团队决定将整个微服务架构从JDK8全面升级到JDK17,这个决定并非一时冲动。作为一套已经稳定运行3年的生产系统,升级过程确实遇到了不少预料之外的坑。今天就把这次升级的经验教训完整记录下来,给…

2026/7/21 6:44:55阅读更多 →
Windows系统文件dmusic.dll丢失找不到问题解决

Windows系统文件dmusic.dll丢失找不到问题解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

2026/7/21 6:44:55阅读更多 →
基于Harness框架构建金融大模型问答机器人:从工程化到实战部署

基于Harness框架构建金融大模型问答机器人:从工程化到实战部署

这次我们来看一个在 AI 大模型应用开发领域备受关注的概念——Harness。它不是某个具体的软件或模型,而是一种工程化框架和设计思想,旨在高效、可靠地“驾驭”大模型,将其能力整合到实际业务系统中。对于开发者而言,理解并实践 Ha…

2026/7/21 6:42:55阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 0:51:49阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 0:51:49阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 0:51:49阅读更多 →
Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

📌教程适配:OpenClaw v2.7.9 | 兼容 Windows10/11、macOS 双系统 📖前言 当下各类本地 AI 工具层出不穷,多数产品仅能完成文字问答交互,很难直接操控电脑执行实际操作。OpenClaw,业内常称小龙虾 AI&#…

2026/7/21 0:01:46阅读更多 →
Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

聊《一次Codex项目复盘,问题最后出在流程而不是模型》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&…

2026/7/21 0:01:46阅读更多 →
手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

大家好,还是我。前几期带大家做了心情日记本和可视化大屏,后台有朋友留言:“能不能教点好玩的?我想做游戏,但一行代码都不会。”行,这期就安排。今天的目标:从零做一个五子棋游戏。 带AI对战、三…

2026/7/21 0:03:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/20 22:51:39阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/20 18:51:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/20 18:51:18阅读更多 →