Redis的持久化机制RDB和AOF详解

本文为您介绍redis的持久化机制以及持久化的选型。

目录

持久化策略

RDB(RedisDatabase)快照

AOF(Append Only File)

混合持久化策略

RDB与AOF对比

持久化策略使用建议

Redis数据备份策略建议

补充知识

save与bgsave对比

bgsave的写时复制(COW)机制


持久化策略

Redis提供了很多跟数据持久化相关的配置,大体上,可以组成以下几种策略:

  • 无持久化:完全关闭数据持久化,不保证数据安全。相当于将Redis完全当做缓存。
  • RDB(RedisDatabase)快照:按照一定的时间间隔缓存Redis所有数据快照。
  • AOF(Append Only File):记录Redis收到的每一次写操作。这样可以通过操作重演的方式恢Redis的数据。
  • RDB+AOF:同时保存Redis的数据和操作。

更多内容,请参见https://redis.io/docs/latest/operate/oss_and_stack/management/persistence/

RDB(RedisDatabase)快照

  • 定义:RDB可以在指定的时间间隔,备份当前时间点的内存中的全部数据集,并保存到餐盘文件当中。在恢复时,再将磁盘中的快照文件直接都会到内存里。
  • 特点:RDB存的是全量数据,你甚至可以直接用RDB来传递数据。例如如果需要从一个Redis服务中将数据同步到另一个Redis服务(最好是同版本),就可以直接复制最近的RDB文件。
  • 储存位置:通常是dump.rdb文件。
  • 触发时机
    • 满足配置文件中默认的快照配置时,会自动触发RDB快照。
    • 手动执行save或者bgsave指令时,会触发RDB快照。
      • 其中save方法会在备份期间阻塞主线程。
      • bgsve则不会阻塞主线程。但是他会fork一个子线程进行持久化,这个过程中会要将数据复制一份,因此会占用更多内存和CPU。
    • 主从复制时会触发RDB备份。
      LASTSAVE指令查看最后一次成功执行快照的时间。时间是一个代表毫秒的LONG数字,在linux中可以使用date -d @{timestamp} 快速格式化。
  • 核心配置参数
    这些配置直接影响 RDB 持久化的安全性、性能和存储效率,实际配置时需根据业务对数据一致性的要求、服务器资源(CPU / 磁盘)情况综合权衡。
    配置参数含义默认值配置建议
    dir指定 RDB 文件和 AOF 文件的存储目录无默认值,需手动配置建议设置为独立的持久化目录,如/var/lib/redis
    dbfilename指定 RDB 快照文件的名称dump.rdb保持默认即可,如需区分不同实例可修改,如dump-6379.rdb
    rdbcompression是否启用 RDB 文件压缩(使用 LZF 算法)yes1. 建议保持默认yes,节省磁盘空间
    2. 若 CPU 资源紧张且磁盘充足,可设为no提升性能
    stop-writes-on-bgsave-error当 bgsave 快照写入失败时,是否停止接受新的写入请求stop-writes-oin-bgsave-error 。yes1. 生产环境建议保持默认yes,避免数据不一致
    2. 若有其他数据一致性保障机制,可设为no
    rdbchecksum是否对 RDB 文件启用 CRC64 校验yes1. 建议保持默认yes,确保数据完整性
    2. 若追求极致性能且能接受一定数据风险,可设为no(约提升 10% 性能)

AOF(Append Only File)

  • 定义:以日志的形式记录每个写操作(读操作不记录)。
  • 特点:只允许追加文件而不允许改写文件。
  • 触发时机:每次写操作后。
  • 核心参数配置
    配置参数含义默认值配置建议
    appendonly是否开启 AOF 持久化功能no1. 需持久化时设为yes
    2. 与 RDB 配合使用时建议开启
    appendfilename指定 AOF 文件的名称appendonly.aof保持默认即可,多实例可区分命名(如appendonly-6379.aof
    appendfsyncAOF 同步策略
    no:由操作系统决定何时同步
    everysecond:每秒同步一次
    always:每次操作都同步
    everysecond1. 推荐默认everysecond(平衡安全性和性能)
    2. 极高安全性需求用always(性能损耗大)
    3. 性能优先且可容忍数据丢失用no
    appenddirnameAOF 文件存储子目录
    实际路径为{dir}/{appenddirname}
    无默认值Redis 7 + 新增参数,建议设置单独子目录(如aof)便于管理
    auto-aof-rewrite-percentageAOF 重写触发的增长率阈值100(%)auto-aof-rewrite-min-size配合使用,默认值可满足多数场景
    auto-aof-rewrite-min-sizeAOF 重写的最小文件大小阈值64mb避免小文件频繁重写,可根据业务量调整(如 128mb)
    no-appendfsync-on-rewriteAOF 重写期间是否暂停appendfsync操作no1. 设为yes可提高重写速度,但可能增加数据丢失风险
    2. 追求安全性保持默认no(重写期间仍按策略同步)

    补充说明

    • AOF 重写可通过BGREWRITEAOF命令手动触发,用于紧急优化 AOF 文件。
    • Redis 7 + 的 AOF 重写会生成base.rdb(基础快照)和incr.aof(增量操作),结合了 RDB 和 AOF 的优势。
    • 同步策略和重写参数需根据业务对 "数据安全性" 和 "性能" 的要求综合调整。

混合持久化策略

  • 定义:RDB和AOF两种持久化策略各有优劣,所以在使用Redis时,是支持同时开启两种持久化策略的。
  • 开启方式:在redis.conf配置文件中,有一个aof-use-rdb-preamble参数可以同时打开RDB和AOF两种持久化策略。但此策略,必须先开启aof。
  • 写入过程:如果开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,覆盖原有的AOF文件,完成新旧两个AOF文件的替换。
    于是在 Redis 重启的时候,可以先加载 RDB 的内容,然后再重放增量 AOF 日志就可以完代替替代之前的AOF 全量文件重放,因此重启效率大幅得到提升。混合持久化AOF文件结构如下:

RDB与AOF对比

对比维度RDB(Redis DataBase)AOF(Append Only File)
核心优点1. 文件紧凑,占用存储空间小,适合定期备份
2. 灾难恢复场景中,全量数据恢复效率高
3. 备份时仅 fork 子线程处理,对主线程 IO 性能几乎无影响
4. 大数据量重启时,加载速度远快于 AOF
1. 安全性更高,默认每秒同步(最多丢失 1 秒数据),支持实时同步(always
2. 采用 “追加写入” 模式,无记录不完整问题,可通过redis-check-aof工具修复
3. 自动触发日志重写,避免单个文件过大
4. 日志为可读的操作指令,可手动编辑(如删除误操作FLUSHALL)实现数据恢复
核心缺点1. 仅定期快照,无法实时备份,宕机时可能丢失快照间隔内的所有数据
2. fork 子线程时需克隆内存数据,数据量大 / CPU 性能差时,会导致 Redis 短暂服务停顿
1. 相同数据集下,AOF 文件体积通常远大于 RDB 文件
2. 写操作频繁时,IO 开销更高,备份性能弱于 RDB
适用场景1. Redis 作为缓存使用,对数据丢失容忍度较高
2. 需定期全量备份、快速恢复的场景
3. 非核心业务数据,优先保障 Redis 运行性能
1. 对数据安全性要求高,仅能容忍秒级数据丢失的场景
2. 需避免误操作导致数据丢失,需手动修复日志的场景

持久化策略使用建议

  • 如果您只是把Redis当做一个缓存来用,可以直接关闭持久化。
  • 如果您更关注数据安全性,并且可以接受服务异常宕机时的小部分数据损失,那么可以简单的使用RDB策略。这样性能是比较高的。
  • 不建议单独使用AOF。RDB配合AOF,可以让数据恢复的过程更快。

Redis数据备份策略建议

  • 写crontab定时调度脚本,每小时都copy一份rdb或aof的备份到一个目录中去,仅仅保留最近48小时的备份。

  • 每天都保留一份当日的数据备份到一个目录中去,可以保留最近1个月的备份。

  • 每次copy备份的时候,都把太旧的备份给删了。

  • 每天晚上将当前机器上的备份复制一份到其他机器上,以防机器损坏。

补充知识

save与bgsave对比

save和bgsave都能生成RDB快照,那么他么有什么区别呢?
他们最大的区别就是save⽅法会在备份期间阻塞主线程。bgsve则不会阻塞主线程。但是它会fork⼀个⼦线程进⾏持久化,这个过程中会要将数据复制⼀份,因此会占⽤更多内存和CPU。具体对比如下:

配置自动生成rdb文件后台使用的是bgsave方式。

bgsave的写时复制(COW)机制

Redis 借助操作系统提供的写时复制技术(Copy-On-Write, COW),在生成快照的同时,依然可以正常处理写命令。

简单来说,bgsave 子进程是由主线程 fork 生成的,可以共享主线程的所有内存数据。

bgsave 子进程运行后,开始读取主线程的内存数据,并把它们写入 RDB 文件。此时,如果主线程对这些数据也都是读操作,那么,主线程和 bgsave 子进程相互不影响。但是,如果主线程要修改一块数据,那么,这块数据就会被复制一份,生成该数据的副本。然后,bgsave 子进程会把这个副本数据写入 RDB 文件,而在这个过程中,主线程仍然可以直接修改原来的数据。

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

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

相关文章

Vue 3 实战:从零到一用 vue-pdf-embed 打造功能齐全的 PDF 查看器

你好&#xff0c;Vue 开发者们&#xff01; 在 Web 开发中&#xff0c;我们经常会遇到需要在页面中直接展示 PDF 文件的需求&#xff0c;例如预览合同、显示报告或在线阅读文档。你可能会想到用 <iframe> 或者一些重量级的库&#xff0c;但它们往往不够灵活或过于臃肿。…

adb的常用命令

adb devices 用USB数据线连接电脑&#xff0c;查看连接上的设备 adb tcpip 5555 切换计算机的adb为wifi连接模式 adb connect 192.168.2.250:5555 连接手机的ip地址&#xff0c;如果连接成功&#xff0c;则可拔掉数据线 adb 查看adb的相关信息&#xff0c;包括版本号&#xff0…

稳态太阳光模拟器 | 多源分布式设计的要点有哪些?

稳态太阳模拟器的多源分布式设计&#xff0c;是一种通过多组独立光源单元分布式排布、结合稳态光学调控技术&#xff0c;实现对太阳光谱、辐照强度及辐照均匀性精准复现的高端光模拟技术。其核心优势在于突破传统模拟光源在长期工作稳定性、大面积辐照均匀性及能量传递效率上的…

代码随想录 day 35 动态规划

第九章 动态规划part03 正式开始背包问题&#xff0c;背包问题还是挺难的&#xff0c;虽然大家可能看了很多背包问题模板代码&#xff0c;感觉挺简单&#xff0c;但基本理解的都不够深入。 如果是直接从来没听过背包问题&#xff0c;可以先看文字讲解慢慢了解 这是干什么的。 …

大数据探索性分析——抽样技术应用

2.3 概率抽样 一、简单随机抽样 # 数据预处理 LoanStats3c read.csv("D:/OneDrive - stu.fynu.edu.cn/大四上学期/ysq-大数据探索性分析/data/2数据集二&#xff1a;Loan Data--Lending Club/LoanStats3c/LoanStats3c.csv", header TRUE, fill TRUE, comment.char…

20 webUI应用中Controlnet精讲(06)-结构理解与其它

前面的篇章已经详细讲解了线条约束、三维关系与空间深度、人体姿态等几类controlnet的功能与应用&#xff0c;本节内容将对通过controlnet对图像的结构理解及控图效果。 序号 分类 Controlnet名称 备注 1 线条约束 Canny&#xff08;硬边缘&#xff09; 约束性强&#x…

【MFC】对话框属性:Center(居中)

前言 本文介绍对话框属性中的Center(居中)&#xff0c;同时给出相关示例便于理解。 目录1 位置2 详解3 示例1 位置 首先介绍一下这个属性在哪里。 在资源视图中双击对话框节点&#xff0c;打开该对话框&#xff1b; 鼠标右键工作区空白处&#xff0c;单击属性&#xff1b; 此时…

SciKit-Learn 全面分析分类任务 breast_cancer 数据集

背景 乳腺癌数据集&#xff0c;569个样本&#xff0c;30个特征&#xff0c;2个类别&#xff08;良性/恶性&#xff09; 步骤 加载数据集拆分训练集、测试集数据预处理&#xff08;标准化&#xff09;选择模型模型训练&#xff08;拟合&#xff09;测试模型效果评估模型 分析方法…

【开题答辩全过程】以 _基于SpringBoot技术的“树洞”心理咨询服务平台的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

R 语法高亮为什么没有,是需要安装专用的编辑软件,R语言自带的R-gui 功能还是比较简单

R 语法高亮为什么没有&#xff0c;是需要安装专用的编辑软件&#xff0c;R语言自带的R-gui 功能还是比较简单 以下是一些主流的 R 编辑软件&#xff08;IDE / 编辑器&#xff09;&#xff0c;适用于不同需求的用户&#xff1a; ✅ 最推荐&#xff1a;RStudio&#xff08;免费/…

使用UniApp实现下拉框和表格组件页面

使用UniApp实现下拉框和表格组件页面UniApp提供了一套完整的跨平台开发框架&#xff0c;支持在多个平台上运行。下拉框和表格是常见的UI组件&#xff0c;可以通过UniApp内置组件或第三方插件实现。下拉框组件的实现UniApp内置的<picker>组件可以实现下拉选择功能。以下是…

JavaScript 对象说明

JavaScript 对象说明 1. 对象的基本概念 在 JavaScript 中&#xff0c;对象是一种复合数据类型&#xff0c;用于存储相关联的属性和方法。对象可以看作是属性的集合&#xff0c;其中每个属性都由一个键&#xff08;key&#xff09;和一个值&#xff08;value&#xff09;组成。…

【竞赛系列】机器学习实操项目04——客户信用评估模型开发全流程(baseline)

上一章&#xff1a;机器学习实操项目03——Scikit-learn介绍及简单分类案例 下一章&#xff1a; 机器学习核心知识点目录&#xff1a;机器学习核心知识点目录 机器学习实战项目目录&#xff1a;【从 0 到 1 落地】机器学习实操项目目录&#xff1a;覆盖入门到进阶&#xff0c;大…

C++中的单例模式的实现

1 什么是单例模式单例模式 是一种创建型设计模式&#xff0c;确保一个类在整个程序生命周期中只有一个实例&#xff0c;并提供一个全局访问点。核心要求&#xff1a;类不能被外部随意创建&#xff08;禁止 public 构造函数或限制实例数量&#xff09;。不能被复制或移动。提供一…

汇编基础1

1.格式伪操作&#xff1a;它们不是ARM处理器实际的指令&#xff08;如MOV&#xff0c; ADD等&#xff09;&#xff0c;而是写给汇编器看的命令&#xff0c;用于指导汇编器如何工作area reset, code, readonlycode32entry内容 endarea: 这是最重要的一个伪操作&#xff0c;用…

设计模式(C++)详解—单例模式(2)

<摘要> 单例模式是创建型设计模式中最简单但应用最广泛的模式之一&#xff0c;它确保一个类只有一个实例并提供全局访问点。本文从历史背景和核心概念出发&#xff0c;系统阐述了单例模式的产生缘由和演进脉络&#xff0c;深入剖析了其在资源管理、状态一致性和访问控制方…

kafka如何保证消息的顺序性

kafka如何保证消息的顺序性 Kafka只能在分区&#xff08;Partition&#xff09;级别保证消息的顺序性&#xff0c;而不能在主题&#xff08;Topic&#xff09;级别保证全局顺序。 核心原理&#xff1a;分区和偏移量分区&#xff08;Partition&#xff09;是顺序性的基础&#x…

传输层:UDP/TCP协议

网络协议图 一.UDP 特点: 无连接&#xff0c;不可靠&#xff0c;面向数据报&#xff0c;全双工&#xff08;前面网络编程中介绍过&#xff09; 格式: 服务器的端口号一般都是程序员指定的(这样你才能访问到),客户端的端口号是系统自动分配的(如果提前指定好, 可能会与其他程…

A/B测试全解析:原理、流程与实战案例

A/B测试&#xff08;AB Testing&#xff09;原理与实践全解析 在数据驱动的时代&#xff0c;A/B测试几乎是每一个互联网公司都会使用的实验方法。无论是电商平台优化转化率&#xff0c;还是内容平台提升点击率&#xff0c;抑或是游戏公司提升留存&#xff0c;A/B测试都是最常见…

循环神经网络(三):小练习

RNN小练习 要求&#xff1a; 假设有 4 个字 吃 了 没 &#xff1f;&#xff0c;请使用 torch.nn.RNN 完成以下任务 将每个进行 one-hot 编码请使用 吃 了 没 作为输入序列&#xff0c;了 没 &#xff1f; 作为输出序列RNN 的 hidden_size 64请将 RNN 的输出使用全连接转换成 4…