目录

一、AOF 的核心逻辑:“每笔交易都记流水”

二、AOF 的三个步骤:从 “临时记录” 到 “正式归档”

1. 命令追加:记到 “临时小本本”

2. 写入与同步:抄到 “正式流水册”

3. AOF 还原:拿 “流水册” 重放交易

三、AOF 重写:给 “流水册” 瘦身(解决文件膨胀)

重写逻辑:派 “实习生(子进程)” 写 “精简流水册”

四、衔接之前的结构知识


如果把 Redis 比作银行的核心交易系统(处理存款、取款、转账等 “写操作”),那么 AOF 持久化就像银行的 “交易流水单”—— 通过记录 “每一笔交易命令”,确保系统故障后能还原所有账户的最终状态。

一、AOF 的核心逻辑:“每笔交易都记流水”

与 RDB“定期拍纸质账本快照(全量备份)” 不同,AOF 是 “实时记录交易命令(增量备份)”:

  • RDB 像 “每月拍一次金库账本的照片”;
  • AOF 像 “每笔交易都记在流水单上”。

二、AOF 的三个步骤:从 “临时记录” 到 “正式归档”

1. 命令追加:记到 “临时小本本”

struct redisServer {// ...// AOF缓冲区,每次追加到 aof_buf 末尾sds aof_buf;// ...
};

银行柜员每完成一笔交易(如 “给用户 A 存 100 元”,对应 Redis 的SET user:A 100命令),会立刻把交易内容按固定格式(Redis 协议)写进 “临时小本本”(aof_buf缓冲区)

  •  类比:Redis 执行完写命令后,把命令丢进aof_buf临时存着,等后续统一归档。

2. 写入与同步:抄到 “正式流水册”

银行有个 “归档员”(flushAppendOnlyFile函数),负责把 “临时小本本” 的内容抄到 “正式流水册(AOF 文件)”。抄的严格程度appendfsync选项决定,对应三种策略:

appendfsync选项银行场景类比(归档规则)技术特点
always每笔交易后,立刻抄到流水册并强制存进保险箱最安全(最多丢 1 笔交易),但最慢(柜员总在等归档)
everysec每秒抄一次流水册,用小助手(子线程)每秒强制存保险箱平衡安全与性能(最多丢 1 秒交易),Redis 默认选择
no只抄到流水册,啥时候存保险箱交给银行后台(操作系统)最快,但最不安全(后台可能延迟很久存,停电丢多笔)

3. AOF 还原:拿 “流水册” 重放交易

如果银行核心系统故障,要恢复数据,就把 “正式流水册(AOF 文件)” 里的交易,从头到尾再做一遍

  • 银行找个 “模拟柜员”(伪客户端,无网络连接但能执行命令),照着流水册的记录,重新执行每一笔交易(如 “给用户 A 存 100 元”“给用户 B 转 50 元”),最终还原所有账户的余额。

三、AOF 重写:给 “流水册” 瘦身(解决文件膨胀)

问题:流水册会越来越厚

比如反复操作同一个账户:

RPUSH list "A" "B"   # list变成["A","B"]
RPUSH list "C"       # list变成["A","B","C"]
LPOP list            # list变成["B","C"]
RPUSH list "D" "E"   # list变成["B","C","D","E"]

流水册里会记 4 条命令,但最终 list 是["B","C","D","E"]

  • 显然,用  一条RPUSH list "B" "C" "D" "E" 就能代替这 4 条,却能达到同样效果。

重写逻辑:派 “实习生(子进程)” 写 “精简流水册”

为了让流水册变薄,银行会做 “流水册重写”:

  1. 派实习生(子进程):子进程先看当前所有账户的最终状态(比如直接查 list 的最终元素是["B","C","D","E"])。

  2. 生成最简命令:用一条RPUSH list "B" "C" "D" "E"代替原来的 4 条命令,写一本 “精简流水册”。

  3. 处理重写期间的新交易:重写时,新交易(如RPUSH list "F")会同时记到 “原来的流水册” 和 “重写小缓冲区”。

  4. 最终替换:实习生写完 “精简流水册” 后,银行把 “重写小缓冲区” 里的新交易(RPUSH list "F")追加到新流水册末尾,然后用新流水册替换旧的 —— 这样新流水册既包含所有最终状态,又没有冗余命令。

四、衔接之前的结构知识

  • 与 RDB 互补:RDB 是 “定期全量备份(像每月拍账本照片)”,恢复快但实时性差;AOF 是 “增量交易记录(像流水单)”,实时性好但恢复慢、文件易膨胀。Redis 通常结合两者:用 RDB 做基础全量备份,用 AOF 做增量补充,保障数据安全。

  • 与内存对象关联:AOF 记录的 “写命令”,操作的是 Redis 内存中的字符串、列表、哈希等对象;重写时,子进程直接读取内存中对象的最终状态(如列表的最终元素),再生成最简命令,避免解析旧 AOF 的冗余命令。

这样,AOF 就像银行 “既实时记流水,又定期给流水瘦身” 的策略 —— 既保证交易可追溯,又避免流水册无限膨胀。

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

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

相关文章

代码随想录训练营第三十天|LeetCode452.用最少数量的箭引爆气球、LeetCode435.无重叠空间、LeetCode763.划分字母空间

452.用最少数量的箭引爆气球 贪心算法 重合最多的气球射一箭,就是局部用箭数量最少的,全局的用箭数量就是最少的。 首先对二维数组进行排序,这样就可以让气球更加紧凑。 思路:当前气球是否和上一个气球区间重合,如…

数据库事务隔离级别与 MVCC 机制详解

最近在准备面试,正把平时积累的笔记、项目中遇到的问题与解决方案、对核心原理的理解,以及高频业务场景的应对策略系统梳理一遍,既能加深记忆,也能让知识体系更扎实,供大家参考,欢迎讨论。在数据库并发操作…

【Cursor-Gpt-5-high】StackCube-v1 任务训练结果不稳定性的分析

1. Prompt 我是机器人RL方向的博士生正在学习ManiSkill,在学习时我尝试使用相同命令训练同一个任务,但是我发现最终的 success_once 指标并不是相同的,我感到十分焦虑, 我使用的命令如下: python sac.py --env_id"…

文档权限设置不合理会带来哪些问题

文档权限设置不合理会导致信息泄露、合规风险、协作效率下降、责任难以追溯、知识资产流失、员工信任受损、管理成本增加、企业战略受阻。这些问题不仅影响日常运营,更会对企业的长远发展构成威胁。根据IBM《2024数据泄露成本报告》,全球企业因数据泄露的…

Linux网络服务——基础设置

网络服务命令1.ping命令作用:测试网络连通性(使用icmp协议)常见选项:-c:指定ping的次数,默认无限次-I:指定发送请求的网卡[rootlocalhost ~]# ping 192.168.77.78 -c 4 -I ens160 PING 192.168.…

【multisim汽车尾灯设计】2022-12-1

缘由multisim汽车尾灯设计-学习和成长-CSDN问答 为什么模仿别人做的运行没啥效果,啥也看不明白,数字电子技术要做的任务。

Langchain在调用 LLM 时统计 Token 消耗

关键点解析使用上下文管理器with get_openai_callback() as cb:这一行是核心。cb 会自动收集本次调用的 prompt tokens、completion tokens 以及 total tokens。自动统计在上下文退出时,cb 中已经包含了这次调用的消耗情况,无需额外手动计算。累加到全局…

漫谈《数字图像处理》之实时美颜技术

随着移动拍摄、直播、短视频等场景的普及,用户对 “自然、流畅、可控” 的美颜效果需求日益提升 —— 既要消除皮肤瑕疵、优化面部形态,又需避免 “过度磨皮显假”“变形失真”“实时卡顿” 等问题。实时美颜技术的核心并非单一算法的堆砌,而…

MATLAB基于PSO(粒子群算法)优化BP神经网络和NSGA-II(非支配排序遗传算法)多目标优化

代码实现了一个智能算法优化BP神经网络并进行多目标优化的完整流程,结合了PSO(粒子群算法)优化BP神经网络和NSGA-II(非支配排序遗传算法)多目标优化,用于多输入多输出的回归预测问题。 ✅ 一、主要功能 数…

白平衡分块统计数据为什么需要向下采样?

在白平衡处理中,分块统计数据时引入**向下采样(Downsampling)**,核心目标是在保证统计有效性的前提下,解决“计算效率”与“统计鲁棒性”的矛盾,同时避免局部噪声对白平衡判断的干扰。要理解这一设计的必要…

Deathnote: 1靶场渗透

Deathnote: 1 来自 <Deathnote: 1 ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.128&#xff0c;靶场IP192.168.23.129 3&#xff0c;对靶机进行端口…

windows系统服务器测试部署springboot+vue+mysql项目

1. 后端Java应用启动 直接使用命令行启动&#xff08;推荐用于测试&#xff09;&#xff1a; cd C:\Users\Administrator\Desktop\toolset\backed java -jar -Dspring.profiles.activeprod -Dserver.port8083 admin.jar2. 前端静态文件服务 由于你已经有了dist目录&#xff0c;…

Java 与 Docker 的最佳实践

在云原生时代&#xff0c;Docker 已成为应用交付和运行的事实标准。Java 作为企业级开发的主力语言&#xff0c;也需要与容器技术深度结合。然而&#xff0c;Java 程序天然有 JVM 内存管理、启动速度、镜像体积 等特点&#xff0c;如果不做优化&#xff0c;可能导致性能下降甚至…

大数据工程师认证推荐项目:基于Spark+Django的学生创业分析可视化系统技术价值解析

&#x1f496;&#x1f496;作者&#xff1a;计算机编程小央姐 &#x1f499;&#x1f499;个人简介&#xff1a;曾长期从事计算机专业培训教学&#xff0c;本人也热爱上课教学&#xff0c;语言擅长Java、微信小程序、Python、Golang、安卓Android等&#xff0c;开发项目包括大…

【MySQL自学】SQL主键使用误区:你必须知道的关键细节

在日常数据库操作中&#xff0c;主键&#xff08;Primary Key&#xff09;是我们最常打交道的概念之一。然而&#xff0c;许多开发者&#xff0c;尤其是初学者&#xff0c;常常对其存在一些误解。一个非常经典的问题是&#xff1a;“在SQL中&#xff0c;只要用到主键&#xff0…

Electron 执行python脚本

1 需求背景 有个需求需要Electron执行在本地执行python脚本。希望通过Electron调用python服务并且实现双向通信。 2 解决思路 使用Electon 的{ exec, spawn, execFile, fork } from "child_process"; 能力来执行python脚本&#xff0c;使用spawn可以实现持续交互&…

Leetcode高频 SQL 50 题(基础版)题目记录

Leetcode sql题目记录 文章目录Leetcode sql题目记录570. 至少有5名直接下属的经理1934. 确认率1193. 每月交易I1174. 即时食物配送II176. 第二高的薪水&#xff08;1&#xff09; 子查询为空但外层用了聚合函数&#xff08;2&#xff09;子查询为空而外层没有聚合函数550. 游戏…

RAGFlow切分方法详解

RAGFlow 各切分方法的含义如下,结合文档结构、场景特点等设计,以适配不同类型的知识源: 1. General(通用分块) 逻辑:结合文本排版、格式、语义关联等因素确定分割点,再根据“建议文本块大小(Token 数)”,将文本切分为合适的块。 支持格式:DOCX、EXCEL、PPT、IMAGE、…

支付域——支付与交易概念

摘要本文详细阐述了支付域中支付与交易的核心概念及其相互关系。交易是商品或服务交换的过程&#xff0c;包含多个要素并产生订单或合同。支付则是资金流转的过程&#xff0c;是交易的资金结算环节。支付交易结合了两者&#xff0c;根据不同场景提供多样化的支付产品和服务。文…

(自用)cmd常用命令自查文档

&#xff08;自用&#xff09;cmd常用命令自查文档 Windows CMD 常用命令自查1. 文件与目录操作命令说明示例​cd​显示或切换目录​cd​&#xff1b;cd C:\Windows​​dir​列出目录内容​dir​&#xff1b;dir /a​(含隐藏文件)​md​或mkdir​创建目录​md test​&#xff1…