Redis中AOF的实现方式和AOF重写
一、AOF 的实现方式
- 核心原理
AOF 通过将写操作命令以追加方式记录到日志文件中,重启时通过重放命令恢复数据。与 RDB 的快照机制不同,AOF 是增量记录,更适用于数据一致性要求较高的场景。 - 写入流程
- 命令执行:客户端发送写命令(如
SET key value
),Redis 先执行命令并更新内存数据。 - 缓冲区记录:将命令追加到内存中的 AOF 缓冲区(
aof_buf
),避免频繁磁盘 I/O。 - 磁盘写回:根据
appendfsync
策略(always
、everysec
、no
)决定何时将缓冲区数据同步到磁盘:- Always:每次写命令后同步,数据安全性最高但性能最低。
- Everysec:每秒同步一次,平衡性能与安全性(默认策略)。
- No:依赖操作系统控制刷盘,性能最佳但数据丢失风险最大。
- 命令执行:客户端发送写命令(如
- 数据结构绑定
在 Redis 的存储引擎(Engine
)中,每个数据库(DB
)对象会绑定writeAof
函数,确保写命令触发 AOF 日志记录。例如,执行SET
命令时,会调用db.writeAof
将命令序列化并写入缓冲区。
二、AOF 重写机制
AOF 文件会随时间增长,导致恢复速度变慢。重写通过生成最小化命令集压缩文件,其核心步骤如下:
- 触发条件
- 文件大小超过阈值(默认当前大小 ≥ 基准大小的 1.1 倍且 ≥ 64MB)。
- 手动执行
BGREWRITEAOF
命令。
- 重写过程
- Fork 子进程:主进程通过
fork
生成子进程,子进程共享内存快照(COW 机制)。 - 子进程生成新文件:子进程遍历内存数据,将键值对转换为等效的写命令(如
SET key value
),写入临时文件temp-rewriteaof-bg-pid.aof
。 - 主进程记录增量命令:重写期间,主进程将新写命令同时写入
aof_buf
和 AOF 重写缓冲区(aof_rewrite_buf
),避免数据丢失。 - 合并增量数据:子进程完成后,主进程将
aof_rewrite_buf
中的命令追加到临时文件。 - 原子替换文件:使用
rename
系统调用将临时文件替换为原 AOF 文件,完成重写。
- Fork 子进程:主进程通过
- 优化与问题
- 内存开销:
aof_rewrite_buf
与aof_buf
内容重复,可能导致内存占用翻倍。 - CPU 开销:主进程需处理
aof_rewrite_buf
写入及子进程通信,可能影响性能。 - 改进方案:Redis 7.0 引入 MP-AOF(Multi Part AOF),通过分阶段写入减少内存占用和阻塞时间。
- 内存开销:
三、AOF 与 RDB 的对比
特性 | AOF | RDB |
---|---|---|
数据恢复 | 通过重放命令,恢复时间较长。 | 二进制加载,恢复速度快。 |
文件体积 | 较大(记录所有写命令)。 | 较小(紧凑的二进制快照)。 |
数据安全性 | 支持秒级持久化(everysec )。 | 定期快照,可能丢失部分数据。 |
适用场景 | 需要强一致性的场景(如金融交易)。 | 备份、主从复制、快速恢复。 |
四、总结
AOF 通过记录写命令实现持久化,其重写机制有效解决了文件膨胀问题,但需权衡内存与 CPU 开销。在实际应用中,建议结合 RDB 使用(混合持久化模式),以兼顾性能与数据安全性。
相关文章:
Redis中AOF的实现方式和AOF重写
一、AOF 的实现方式 核心原理 AOF 通过将写操作命令以追加方式记录到日志文件中,重启时通过重放命令恢复数据。与 RDB 的快照机制不同,AOF 是增量记录,更适用于数据一致性要求较高的场景。写入流程 命令执行:客户端发送写命令&am…...
Supervisor的安装和使用
Supervisor 使用笔记(CentOS 8 环境) 本周,老师让我使用supervisor管理项目服务,当时第一次听说过这个进程管理工具😶🌫️,就上网搜了搜安装和使用,又用ai查了一些细节࿰…...
JVM 内存区域详解
JVM 内存区域详解 Java 虚拟机(JVM)的内存区域划分为多个部分,每个部分有特定的用途和管理机制。以下是 JVM 内存区域的核心组成及其功能: 一、运行时数据区(Runtime Data Areas) 1. 线程共享区域 内存…...
【java】在 Java 中,获取一个类的`Class`对象有多种方式
在 Java 中,获取一个类的Class对象有多种方式。Class对象代表了 Java 中的一个类或接口的运行时类信息,可以用于反射操作。以下是获取Class对象的几种常见方法: 1.使用.class属性 每个类都有一个.class属性,可以直接获取该类的Cl…...
蓝桥杯:对字符串处理常用知识笔记
一、前面四个是计算带有空格字符串的的长度计算 C语言代码 #include<string.h> #include<stdio.h> int main() { char s[105]; gets(s); printf("%d", strlen(s)); return 0; } 算法2 C 代码(常用) #include <iostream> #in…...
c++网络编程,信号透传可能是什么意思
在 C 网络编程中,**信号透传**(Signal Pass-Through)通常 refers to the concept of allowing signals to propagate through a network protocol stack without being interrupted or modified. 具体来说,信号透传可以涉及到几个…...
数据结构与算法学习笔记----贪心·绝对值不等式
数据结构与算法学习笔记----贪心绝对值不等式 author: 明月清了个风 first publish time: 2025.4.5 ps⭐️感觉其实是一个数学的问题, Acwing 104. 货仓选址 [原题链接](104. 货仓选址 - AcWing题库) 在一条数轴上有 N N N家商店,他们的坐标分别为 A…...
CUDA学习--体验GPU性能
学习来源:2 CUDA Python--并行计算基础-卷积计算以及共享内存_哔哩哔哩_bilibili 处理一张图片的处理速度对比 import cv2 from numba import cuda import time import math cuda.jit() def process_gpu(img,channels):tx cuda.blockIdx.x*cuda.blockDim.xcuda…...
博途 TIA Portal之1200做主站与200SMART的S7通讯
有时候,我们与之作S7通讯的西门子系PLC并不是同一个厂商或是同一时期供货的,也有可能不在一个编程软件中。此时进行S7能讯会有所不同。本文将演示博途与200SMART做S7通讯。 1、硬件准备 1200PLC一以,200SMART一台,网线2根,交换机一台。 2、关于编程 1200做主站,因此需…...
a标签download下载图片
a标签的download属性是HTML5中新增的一个属性,用于指定链接点击时直接下载文件,而不是在浏览器中打开文件。 基本用法 指定下载文件名:在a标签中添加download属性,并指定一个文件名。例如: <a href"…...
#SVA语法滴水穿石# (013)关于 disable iff、matched 、expect 的用法
SystemVerilog 断言(SVA)中 disable iff、matched 和 expect 的语法知识。 1. disable iff (condition) 功能与定义 作用:当指定条件(condition)为真时,禁用当前属性的检查。 常用于复位(rese…...
Day2-2:前端项目uniapp壁纸实战
再在wallpaper新建一个目录components 在components下新建组件common-title 记得点击创建同名目录 在index加 <view class"select"><common-title></common-title></view> 图片换了下,原来的有点丑,图片可按自己喜欢…...
pycharm如何通过跳板机连接服务器在本地debug
现在假设你有一个服务器,需要跳板机登陆,但是你从跳板机到服务器,只知道能直接通过ssh连接。 首先你可以现在本地创建一个 SSH 配置文件(~/.ssh/config): Host jumpHostName 跳板机地址Port 端口User 用户…...
Mysql explain中列的解析
EXPLAIN列的解释: table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL possible_keys:查询可以利用的索引&#…...
场馆预定系统小程序PHP+uniapp
场馆预定系统小程序:基于PHPUniApp的多场景体育场馆智慧化解决方案 随着全民健身意识的提升,体育场馆的数字化管理需求日益增长。场馆预定系统小程序凭借其轻量化、高便捷性,成为体育馆、羽毛球馆、兵乒球馆等场所提升运营效率的核心工具。本…...
05.unity 游戏开发-3D工程的创建及使用方式和区别
05.unity 游戏开发-3D工程的创建及使用方式和区别 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是存在的有:学习and理解的关联性,希望对您有用~ unity简介…...
php8 命名参数使用教程
简介 PHP 8 引入 命名参数(Named Arguments),允许在调用函数时按参数名传递值,而不是按照参数位置。这增强了代码的可读性、灵活性,并减少参数顺序依赖。 基本用法 传统位置参数(Positional Arguments&a…...
Transformer与注意力机制详解
1 Transformer与注意力机制详解 本文直观上详细介绍了大语言模型中十分重要的结构——Transformer,及其核心:注意力机制的原理。 1. Transformer结构 基础结构如下图所示,左侧由一系列Encoder block(编码器)构成,接收字词句输入;右侧由一系列Decoder block(解码器)…...
xLua环境控制+xLua的Lua调用C#的1
编写自定义加载器加载指定路径的Lua文件: using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using XLua;//Lua是脚本语言,编写代码脚本是实现功能最重要的方式 public class Loader : MonoBehaviour …...
RabbitMQ应用问题
RabbitMQ应用问题 一.幂等性1.简述概念2.MQ的幂等性介绍3.解决幂等性问题(1)全局唯一ID(2)业务逻辑判断 二.顺序性保障1.简单介绍2.无法保证顺序性的场景3.保障方案1)单队列消费者2)分区消费3)消息确认机制4)业务逻辑控制 三.消息积压问题1.原因分析2.解决方案 一.幂等性 1.简…...
轻量化大模型微调工具XTuner指令微调实战(下篇)
接着上篇文章《轻量化大模型微调工具XTuner指令微调实战(上篇)》来接着写教程。 一、模型转换 模型训练后会自动保存成 PTH 模型(例如 iter_500.pth),我们需要利用 xtuner convert pth_to_hf 将其转换为 HuggingFace…...
Redis数据结构之ZSet
目录 1.概述2.常见操作2.1 ZADD2.2 ZRANGE2.3 ZREVRANGE2.4 ZRANGEBYSCORE2.5 ZSCORE2.6 ZCARD2.6 ZREM2.7 ZINCRBY2.8 ZCOUNT2.9 ZMPOP2.10 ZRANK2.11 ZREVRANK 3.总结 1.概述 ZSet和Set一样也是String类型元素的集合,且不允许重复的成员,不同的是ZSet…...
STM32提高篇: CAN通讯
STM32提高篇: CAN通讯 一.CAN通讯介绍1.物理层2.协议层二.STM32CAN外设1.CAN控制器的3种工作模式2.CAN控制器的3种测试模式3.功能框图三.CAN的寄存器介绍1.环回静默模式测试2.双击互发测试四.CAN的HAL代码解读一.CAN通讯介绍 CAN(Controller Area Network 控制器局域网,简称…...
贪心算法之最小生成树问题
1. 贪心算法的基本思想 贪心算法在每一步都选择局部最优的边,希望最终得到整体最优的生成树。常见的两种 MST 算法为 Kruskal 算法 和 Prim 算法。这两者均满足贪心选择性质和最优子结构性质,即: 贪心选择性质:局部最优选择&…...
C++EasyX之五子棋PVP和PVE
以下是该C EasyX五子棋代码的详细解析: 1 代码 1.1 全代码 #include <graphics.h> #include <conio.h> #include <Windows.h> #include <cmath> #include <vector> #include <tuple> #include <algorithm>using na…...
【Tauri2】015——前端的事件、方法和invoke函数
目录 前言 正文 准备 关键url 获取所有命令 切换主题set_theme 设置大小 获得版本version 名字name 监听窗口移动 前言 【Tauri2】005——tauri::command属性与invoke函数-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146581991?spm1001.2014.3001.…...
【C++奇遇记】C++中的进阶知识(继承(二))
🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如…...
qt designer 软件主题程序设计
对于使用Qt Designer设计的界面,主题切换的实现需要结合Qt的信号槽机制、样式表动态加载以及资源管理。以下是针对Qt Designer UI的详细解决方案: 一、UI文件与主题系统的整合架构 二、核心实现步骤 1. 动态样式表加载系统 // ThemeManager.h class …...
2025 年 4 月补丁星期二预测:微软将推出更多 AI 安全功能
微软正在继续构建其 AI 网络安全战略,并于本月宣布在 Microsoft Security Copilot 中引入新代理。 他们引入了用于网络钓鱼分类的代理、用于数据丢失预防和内部风险管理的警报分类、条件访问优化、漏洞修复和威胁情报简报。 这些代理的目标是不断从这些不同学科中…...
docker swarm常用命令
1、初始化Swarm集群 用于初始化一个Swarm集群,并将当前节点设置为Manager节点。 用法:docker swarm init --advertise-addr <Manager节点IP> # docker swarm init --advertise-addr 192.168.1.100 这会将当前节点初始化为Swarm集群的管理节点&…...
抖音直播位置与IP属地不同?解析原因与应对策略
在当今短视频直播盛行的时代,抖音作为头部平台吸引了大量主播和观众。然而,许多用户发现一个令人困惑的现象:直播间显示的位置信息与账号IP属地不一致。这种情况不仅让观众产生疑问,也可能给主播带来不必要的麻烦。本文将深入分析…...
「限时开源」全网首发!DeepSeek-R1+AI绘画+音乐生成全栈源码
—企业级AIGC私有化终极方案,3大模态整合,成本直降90% 行业痛点:为什么企业急需这套方案? 1. 多模态AIGC的三大困局 成本失控 API吸血: 使用MidjourneyStable DiffusionGPT-4Suno API生成内容,企业月均支…...
设计模式简述(二)单例模式
单例模式 描述基本使用防破坏单例饿汉式懒汉式有上限多例 描述 一个类全局只有一个实例,自行实例化并提供给使用。 构造函数私有化是前提 基本使用 防破坏单例 防反射:在构造函数中判断类中实例是否已初始化 private InnerClassSingleton (){if(Inn…...
区块链钱包:与主流钱包APP的区别
前言 在前端开发者速入:DApp中的前端要干些什么?文中我简单讲解了在DApp中前端开发者要干的是什么,本来在接下来的内容中我应该继续讲解在DApp中前端开发者的一系列工作和其他所要用到的技术栈,但是为了方便后续的讲解,我们这里不得不提及一下在区块链中让无数人又爱又恨…...
23种设计模式-行为型模式-中介者
文章目录 简介问题解决代码架构优势 总结 简介 中介者是一种行为设计模式, 能让你减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互,强制让它们通过一个中介者对象进行合作。 问题 假如你有一个创建和修改用户资料的对话框࿰…...
mysql数据库中getshell的方式总结
mysql数据库中getshell的方式总结 MySQL版本大于5.0,MySQL 5.0版本以上会创建日志文件,我们通过修改日志文件的全局变量,就可以GetSHELL,下面这篇文章主要给大家介绍了关于mysql数据库中getshell的方式,需要的朋友可以参考下 outfile和dumpfile写shell 利用条件 …...
神经网络基础
神经网络的基本组成元素 一个神经元: 单层神经网络: 多层神经网络:(前向计算) 为什么要使用激活函数 如果不使用激活函数,每层只对上层的输入进行线性变换,实际这些线性变换可以归为一层即可。…...
Redis的公共操作命令
目录 1.Key操作命令1.1 keys *1.2 exists <key]>1.3 type <key>1.4 del <key>1.5 unlink <key>1.6 ttl <key>1.7 expire <key> <秒数>1.8 move <key> <index> 2.库操作命令2.1 select <index>2.2 dbsize2.3 flush…...
Redash:一个开源的数据查询与可视化工具
Redash 是一款免费开源的数据可视化与协作工具,可以帮助用户快速连接数据源、编写查询、生成图表并构建交互式仪表盘。它简化了数据探索和共享的过程,尤其适合需要团队协作的数据分析场景。 数据源 Redash 支持各种 SQL、NoSQL、大数据和 API 数据源&am…...
Transformer+BO-SVM多变量时间序列预测(Matlab)
TransformerBO-SVM多变量时间序列预测(Matlab) 目录 TransformerBO-SVM多变量时间序列预测(Matlab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 本期推出一期高创新模型,基于Transformer提取时序特征后输入S…...
【Redis】服务端高并发分布式结构
一、认识Redis Redis是开源的,用于存储数据的,在内存中存储数据。Redis被用作数据库,缓存,消息队列等一些作用。 在数据库的学习中,我们学习了MySQL,但是MySQL有一些大问题:其访问速度比较慢。在…...
C和C++(list)的链表初步
链表是构建其他复杂数据结构的基础,如栈、队列、图和哈希表等。通过对链表进行适当的扩展和修改,可以实现这些数据结构的功能。想学算法,数据结构,不会链表是万万不行的。这篇笔记是一名小白在学习时整理的。 C语言 链表部分 …...
第九课:LoRA模型的原理及应用
文章目录 Part.01 3种LoRA的使用方式Part.02 5种LoRA的应用方向Part.01 3种LoRA的使用方式 LoRA能够在家用级设备上训练,实现对Checkpoint在某些方面的微调使用Lora的三种方式:放置Lora模型到目录中,然后作为提示词的一部分输入。点击生成按钮下面的“画”,然后打开Additio…...
make_01_Program_07_$@ $^ 是什么含义
在 Makefile 中,$ 和 $^ 是自动变量,用于表示目标和依赖关系的特殊含义。它们常用于规则中的命令部分,以便简化 Makefile 的书写。 自动变量解析 $: $ 表示当前规则的目标文件名。换句话说,在一个特定的规则中&#x…...
CKPT文件是什么?
检查点(Checkpoint,简称ckpt)是一种用于记录系统状态或数据变化的技术,广泛应用于数据库管理、机器学习模型训练、并行计算以及网络安全等领域。以下将详细介绍不同领域中ckpt检查点的定义、功能和应用场景。 数据库中的ckpt检查点…...
YOLOv11训练教程:PyTorch与PyCharm在Windows 11下的完整指南
YOLOv11训练教程:PyTorch与PyCharm在Windows 11下的完整指南 介绍与引言 YOLO(You Only Look Once)是当前最流行的实时目标检测算法系列之一,YOLOv11作为该系列的最新演进版本,继承了YOLO家族高效、快速的特点,同时在精度和速度…...
使用MATIO库写入MATLAB结构体(struct)数据的示例程序
使用MATIO库写入MATLAB结构体(struct)数据的示例程序 MATIO是一个用于读写MATLAB数据文件(.mat)的开源C库。下面是一个完整的示例程序,展示如何使用MATIO库创建一个包含结构体数据的MAT文件。 示例程序 #include <stdio.h> #include <stdlib.h> #inc…...
【大模型深度学习】提示学习:Prefix tuning 、P-tuning v2、P-tuning 到底有什么区别?
Prefix tuning 、P-tuning v2、P-tuning还在傻傻分不清。 到底有什么区别,本文希望说明白这些区别,如有错误欢迎指出。 一、为什么需要提示学习? 从全参微调到参数高效微调(PEFT),这些微调方法的思想都是重新训练模…...
多周期多场景的供应链优化问题 python 代码
这段代码是一个使用 Gurobi 优化器的混合整数规划(MIP)模型,用于解决一个多周期多场景的供应链优化问题。代码定义了一个名为 `MCCG` 的类,该类包含了多个方法,用于构建和解决主问题(Master Problem)、子问题(Subproblem)和子子问题(Sub-subproblem)。下面是对代码中…...
CCF GESP Python编程 一级认证真题 2025年3月
Python 一级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 D D B D D C B D C A B D C A A 一、单选题(每题 2 分,共 30 分) 第 1 题 2025年春节有两件轰动全球的事件,一个是DeepSeek横空出世,另一…...