如何避免redis长期运行持久化AOF文件过大的问题:AOF重写
一、AOF 重写的核心作用
通过 重建 AOF 文件,解决以下问题:
- 体积压缩:消除冗余命令(如多次修改同一 key),生成最小操作集合。
- 混合持久化支持(若启用
aof-use-rdb-preamble yes):生成 RDB 头部 + 增量 AOF 命令。 - 数据一致性:确保 AOF 文件仅包含有效数据集的完整操作记录。
二、触发 AOF 重写的方式
1. 自动触发
通过 redis.conf 配置触发条件:
auto-aof-rewrite-percentage 100 # 当前AOF文件体积比上次重写后体积增长100%时触发 auto-aof-rewrite-min-size 64mb # AOF文件至少达到64MB才允许触发
-
触发逻辑:
当前AOF大小 ≥ 上次重写后大小 * (1 + auto-aof-rewrite-percentage%)
且当前AOF大小 ≥ auto-aof-rewrite-min-size。 -
调整建议:
- 高频写入场景:降低
auto-aof-rewrite-percentage(如 50%),提高重写频率。 - 低频写入场景:增大
auto-aof-rewrite-min-size(如 1GB),避免频繁重写。
- 高频写入场景:降低
2. 手动触发
执行命令强制启动重写:
# 异步后台重写(推荐)
redis-cli BGREWRITEAOF
# 同步阻塞重写(生产环境慎用)
redis-cli REWRITEAOF
三、监控 AOF 重写状态
通过 Redis 命令查看关键指标:
BASH
redis-cli INFO PERSISTENCE
重点关注以下字段:
| 字段 | 说明 |
|---|---|
aof_rewrite_in_progress | 是否正在重写(1 表示进行中)。 |
aof_current_size | 当前 AOF 文件大小(字节)。 |
aof_base_size | 上次重写完成时的 AOF 文件大小(字节)。 |
aof_buffer_length | 重写期间缓冲的写操作数量(若值过大,可能影响内存)。 |
四、AOF 重写的工作原理
- fork 子进程:
Redis 主进程 fork 一个子进程执行重写任务,父进程继续处理客户端请求。 - 写入新文件:
子进程根据内存中的数据生成新 AOF 文件(若启用混合持久化,头部为 RDB 格式)。 - 缓冲增量操作:
重写期间的新写操作会被记录到 AOF 重写缓冲区 和 AOF 缓冲区。 - 替换旧文件:
重写完成后,子进程通知父进程将缓冲区中的增量操作追加到新文件,并原子替换旧 AOF 文件。
五、关键配置参数
| 参数 | 说明 |
|---|---|
aof-use-rdb-preamble | 是否启用混合持久化(Redis 4.0+,默认 yes)。 |
aof-rewrite-incremental-fsync | 重写时每生成 32MB 数据强制刷盘(默认 yes),避免大段数据丢失。 |
aof-load-truncated | AOF 文件损坏时是否加载截断的数据(默认 yes),牺牲部分数据保证可用性。 |
六、操作示例
1. 手动触发并观察进度
BASH
# 触发后台重写
redis-cli BGREWRITEAOF
# 监控重写状态
watch -n 1 "redis-cli INFO PERSISTENCE | grep -E 'aof_rewrite_in_progress|aof_current_size'"
2. 验证新 AOF 文件
BASH
# 检查AOF文件完整性
redis-check-aof --fix appendonly.aof
七、注意事项
- 资源消耗:
- 重写期间会占用额外内存(保存副本数据)和 CPU(生成新文件)。
- 大数据集时
fork()可能阻塞主进程(考虑升级到 Redis 7.0+ 优化内存效率)。
- 磁盘空间:
确保磁盘剩余空间至少为当前 AOF 文件大小的 2 倍。 - 版本兼容性:
混合持久化(RDB头部)需 Redis 4.0+,低版本无法解析。 - 故障恢复:
若重写失败,Redis 会继续使用旧 AOF 文件,需检查日志定位原因(如磁盘满、权限问题)。
八、最佳实践
- 错峰重写:在业务低峰期手动触发(如凌晨),避免影响性能。
- 监控告警:对
aof_current_size和aof_rewrite_in_progress设置阈值告警。 - 定期清理:保留最新 2-3 个 AOF 文件,归档或删除历史文件。
- 版本升级:Redis 7.0+ 优化了 AOF 重写的内存效率和稳定性,建议升级。
通过合理配置和监控,AOF 重写可有效管理文件体积,平衡性能与数据安全性。
相关文章:
如何避免redis长期运行持久化AOF文件过大的问题:AOF重写
一、AOF 重写的核心作用 通过 重建 AOF 文件,解决以下问题: 体积压缩:消除冗余命令(如多次修改同一 key),生成最小操作集合。混合持久化支持(若启用 aof-use-rdb-preamble yes)&am…...
uni-app发起网络请求的三种方式
uni.request(OBJECT) 发起网络请求 具体参数可查看官方文档uni-app data:请求的参数; header:设置请求的 header,header 中不能设置 Referer; method:请求方法; timeout:超时时间,单位 ms&a…...
以下是一个使用 HTML、CSS 和 JavaScript 实现的登录弹窗效果示例
以下是一个使用 HTML、CSS 和 JavaScript 实现的登录弹窗效果示例: <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>登录弹窗示例</title><style>body {font-family: Aria…...
EasyRTC:智能硬件适配,实现多端音视频互动新突破
一、智能硬件全面支持,轻松跨越平台障碍 EasyRTC 采用前沿的智能硬件适配技术,无缝对接 Windows、macOS、Linux、Android、iOS 等主流操作系统,并全面拥抱 WebRTC 标准。这一特性确保了“一次开发,多端运行”的便捷性,…...
LeetCode1287
LeetCode1287 目录 题目描述示例思路分析代码段代码逐行讲解复杂度分析总结的知识点整合总结 题目描述 给定一个非递减的整数数组 arr,其中有一个元素恰好出现超过数组长度的 25%。请你找到并返回这个元素。 示例 示例 1 输入: arr [1, 2, 2, 6, 6, 6, 6, 7,…...
【计算机网络】网络层数据包(Packet)格式
在计算机网络中,数据包(Packet) 是网络层的协议数据单元(PDU),用于在不同网络之间传输数据。数据包的格式取决于具体的网络层协议(如 IPv4、IPv6 等)。以下是常见数据包格式的详细说…...
使用vite打包并部署vue项目到nginx
1 使用 Vite 创建 vue3 项目 Vite 是一个新型的前端构建工具,专为现代浏览器和工具链而设计,提供了极快的冷启动和热模块更新(HMR)速度。以下是使用 Vite 创建 Vue 3 项目的详细步骤: 一、安装 Node.js 和 npm 首先…...
深度学习笔记之自然语言处理(NLP)
深度学习笔记之自然语言处理(NLP) 在行将开学之时,我将开始我的深度学习笔记的自然语言处理部分,这部分内容是在前面基础上开展学习的,且目前我的学习更加倾向于通识。自然语言处理部分将包含《动手学深度学习》这本书的第十四章,…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十九节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(ClearDiagnosticInformation_0x84服务) 作者:车端域控测试工程师 更新日期:2025年02月14日 关键词:UDS协议、0x84服务、清除诊断信息、ISO 14229-1:2023、ECU测试 一、服…...
自动化测试框架搭建-单次接口执行-三部曲
目的 判断接口返回值和提前设置的预期是否一致,从而判断本次测试是否通过 代码步骤设计 第一步:前端调用后端已经写好的POST接口,并传递参数 第二步:后端接收到参数,组装并请求指定接口,保存返回 第三…...
Spring Bean的生命周期和作用域
一、Bean 生命周期 Bean的定义Bean的实例化属性注入Bean的初始化Bean的使用Bean的销毁 可以增强的位置: PostConstruct:属性注入后,afterPropertiesSet方法 (前提实现:InitializingBean接口)前增强。 Pr…...
DeepSeek R1生成图片总结2(虽然本身是不能直接生成图片,但是可以想办法利用别的工具一起实现)
DeepSeek官网 目前阶段,DeepSeek R1是不能直接生成图片的,但可以通过优化文本后转换为SVG或HTML代码,再保存为图片。另外,Janus-Pro是DeepSeek的多模态模型,支持文生图,但需要本地部署或者使用第三方工具。…...
ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL基本配置和使用
ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL基本配置和使用 📍项目地址:https://github.com/lvgl/lv_port_esp32参考文章:https://blog.csdn.net/chentuo2000/article/details/126668088https://blog.csdn.net/p1279030826/article/details/…...
数据库连接池与池化思想
目录 1. 数据库连接池概述 1.1 什么是数据库连接池? 1.2 为什么需要连接池? 2. 池化思想 2.1 池化思想的优点 2.2 池化思想的典型应用 3. 常见的开源数据库连接池 3.1 DBCP 3.2 C3P0 3.3 Druid 4. Druid连接池的使用 4.1 Druid的特点 4.2 D…...
深度学习和机器学习的本质区别(白话版)
深度学习与机器学习的本质区别 在人工智能的世界里,机器学习和深度学习是两个常被提及的概念,但它们在本质上有着重要区别。简单来说,机器学习依赖于人为设定的数据模式,而深度学习则更依赖于数据本身自动发现模式。 机器学习&a…...
halcon激光三角测量(十七)calibrate_sheet_of_light_3d_calib_object
目录 一、calibrate_sheet_of_light_3d_calib_object例程代码二、标定过程三、校准后的3D模型和原3D模型对齐过程四、获得模型标定结果,并生成3D模型五、set_paint 和 dev_set_paint函数 一、calibrate_sheet_of_light_3d_calib_object例程代码 1、第一部分&#x…...
【笔记】LLM|Ubuntu22服务器极简本地部署DeepSeek+联网使用方式
2025/02/18说明:2月18日~2月20日是2024年度博客之星投票时间,走过路过可以帮忙点点投票吗?我想要前一百的实体证书,经过我严密的计算只要再拿到60票就稳了。一人可能会有多票,Thanks♪(・ω・)&am…...
win11 labelme 汉化菜单
替换 app.py,再重启 #labelme 汉化菜单# -*- coding: utf-8 -*-import functools import os import os.path as osp import re import webbrowserimport imgviz from qtpy import QtCore from qtpy.QtCore import Qt from qtpy import QtGui from qtpy import QtWidgetsfrom l…...
Linux的基础指令和环境部署,项目部署实战(下)
目录 上一篇:Linxu的基础指令和环境部署,项目部署实战(上)-CSDN博客 1. 搭建Java部署环境 1.1 apt apt常用命令 列出所有的软件包 更新软件包数据库 安装软件包 移除软件包 1.2 JDK 1.2.1. 更新 1.2.2. 安装openjdk&am…...
利用Java爬虫精准获取商品SKU详细信息:实战案例指南
在电商领域,SKU(Stock Keeping Unit,库存单位)详细信息是电商运营的核心数据之一。它不仅包含了商品的规格、价格、库存等关键信息,还直接影响到库存管理、价格策略和市场分析等多个方面。本文将详细介绍如何利用Java爬…...
数值积分:通过复合梯形法计算
在物理学和工程学中,很多问题都可以通过数值积分来求解,特别是当我们无法得到解析解时。数值积分是通过计算积分区间内离散点的函数值来近似积分的结果。在这篇博客中,我将讨论如何使用 复合梯形法 来进行数值积分,并以一个简单的…...
【Java计算机毕业设计】基于SSM+VUE保险公司管理系统数据库源代码+LW文档+开题报告+答辩稿+部署教程+代码讲解
源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储:…...
C#之上位机开发---------C#通信库及WPF的简单实践
〇、上位机,分层架构 界面层 要实现的功能: 展示数据 获取数据 发送数据 数据层 要实现的功能: 转换数据 打包数据 存取数据 通信层 要实现的功能: 打开连接 关闭连接 读取数据 写入数据 实体类 作用: 封装数据…...
Pytorch论文实现之GAN-C约束鉴别器训练自己的数据集
简介 简介:这次介绍复现的论文主要是约束判别器的函数空间,作者认为原来的损失函数在优化判别器关于真样本和假样本的相对输出缺乏显式约束,因为在实践中,在优化生成器时,鉴别器对生成样本的输出会增加,但对真实数据保持不变,而优化鉴别器会导致其对真实数据的输出增加…...
vue3.x 的shallowReactive 与 shallowRef 详细解读
在 Vue 3.x 中,shallowReactive 和 shallowRef 是两个用于创建浅层响应式数据的 API。它们与 reactive 和 ref 类似,但在处理嵌套对象时的行为有所不同。以下是它们的详细解读和示例。 1. shallowReactive 作用 shallowReactive 创建一个浅层响应式对…...
MongoDB 常用命令速查表
以下是一份 MongoDB 常用命令速查表,涵盖数据库、集合、文档的增删改查、索引管理、聚合操作等场景: 1. 数据库操作 命令说明show dbs查看所有数据库use <db-name>切换/创建数据库(需插入数据后才会显示)db.dropDatabase()…...
DeepSeek崛起的本质分析:AI变局中的中国机会
DeepSeek崛起的本质分析:AI变局中的中国机会 1. 中国AI发展的大背景 近年来,全球AI技术竞争日趋白热化,而中国作为全球第二大经济体,在AI领域的投入和政策支持力度不断加大。大模型是AI产业的制高点,而美国对中国的高…...
Autojs: 使用 SQLite
例子 let db new SQLiteUtil("/sdcard/A_My_DB/sqlite.db");db.fastCreateTable("user_table",{name: "",online: false,},["name"] // 设置 name 为唯一, 重复项 不会添加成功 );// 新增数据的 ID let row_id db.insert("use…...
读书笔记 - 修改代码的艺术
读书笔记 - 修改代码的艺术 第 1 章 修改软件第 2 章 带着反馈工作系统变更方式反馈方式遗留代码修改方法 第 3 章 感知和分离伪协作程序模拟对象 第 4 章 接缝模型接缝 第 5 章 工具自动化重构工具单元测试用具 第 6 章 时间紧迫,但必须修改新生方法(Sp…...
element-plus树形数据与懒加载的实现
环境 vue版本: 2.6.14 需求 树形表格,默认返回当前登录人拥有权限的一个层级的数据,通过点击load懒加载获取下一层的数据,要求有新增、编辑、删除操作。 树类型的懒加载: 当row中包含children字段时,被…...
