Redis之实现持久化与恢复

Redis 如何做持久化与恢复? 本文主要讲了 Redis 的持久化相关功能,持久化一直是影响 Redis 性能的高发地,也是面试中经常被问到的。包括 RDB 相关的特定和优缺点,AOF 的优缺点,事实上,由于 RDB 的数据实时性问题,目前用 AOF 比较多了,而持久化恢复也是优先 AOF。RDB 是旧的模式,现在基本上都使用 AOF,当然,今天两个都会一起聊聊。RDB 流程图:RDB 特点:关于优化:Redis 会压缩 RDB 文件,使用 LZF 算法,让最终的 RDB 文件远小于内存大小,默认开启。但会消耗 CPU。RDB 缺点:RD 阅读详情

一、前言

本文主要讲了 Redis 的持久化相关功能,持久化一直是影响 Redis 性能的高发地,也是面试中经常被问到的。

包括 RDB 相关的特定和优缺点,AOF 的优缺点,事实上,由于 RDB 的数据实时性问题,目前用 AOF 比较多了,而持久化恢复也是优先 AOF。

RDB 是旧的模式,现在基本上都使用 AOF。

二、AOF

由于 RDB 的数据实时性问题,AOF(append only file) 是目前 Redis 持久化的主流方式。
AOF 特点:

  1. 默认文件名是 appendonly.aof。和 RDB 一样,保存在配置中 dir 目录下。
  2. AOF 相比较于 RDB,每次都会保存写命令,数据实时性更高。
  3. AOF 由于每次都会记录写命令,文件会很大,因此需要进行优化,称之为“重写机制”(下面详细说)。
  4. AOF 每次保存的写命令都放在一个缓冲区,根据不同的策略(下面详细说)同步到磁盘。

“重写机制” 细节:
5. fork 子进程(类似 bgsave)
6. 主进程会写到2个缓冲区,一个是原有的 “AOF 缓存区”,一个是专门为子进程准备的 “AOF 重写缓冲区”;
7. 子进程写到到新的 AOF 文件中,批量的,默认 32m;写完后通知主进程。
8. 主进程把“AOF 重写缓冲区”的数据写到新 AOF 文件中。
9. 将新的 AOF 文件替换老文件。
重写流程图:
在这里插入图片描述
缓冲区同步策略,由参数 appendfsync 控制,一共3种:

  1. always:调用系统 fsync 函数,直到同步到硬盘返回;严重影响redis性能。
  2. everysec:先调用 OS write 函数, 写到缓冲区,然后 redis 每秒执行一次 OS fsync
    函数。推荐使用这种方式。
  3. no: 只执行 write OS 函数,具体同步硬盘策略由 OS 决定;不推荐,数据不安全,容易丢失数据。

三、RDB

RDB 流程图:
在这里插入图片描述
RDB 特点:

  1. RDB 是一种快照模式,即——保存的是 key value 数据内容。
  2. RDB 有 2 种持久方式,同步 save 模式和异步 bgsave 模式。由于 save 是同步的,所以可以保证数据一致性,而 bgsave 则不能。
  3. save 可以在客户端显式触发,也可以在 shutdown 时自动触发;bgsave 可以在客户端显式触发,也可以通过配置由定时任务触发,也可以在 slave 节点触发。
  4. save 导致 redis 同步阻塞,基本已经废弃。bgsave 则不会导致阻塞,但也有缺点:在 fork 时,需要增加内存服务器开销,因为当内存不够时,将使用虚拟内存,导致阻塞 Redis 运行。所以,需要保证空闲内存足够。
  5. 默认执行 shutdown 时,如果没有开启 AOF,则自动执行 bgsave。
  6. 每次的 RDB 文件都是替换的。

关于优化:
Redis 会压缩 RDB 文件,使用 LZF 算法,让最终的 RDB 文件远小于内存大小,默认开启。但会消耗 CPU。

RDB 缺点:

  1. 无法秒级持久化。
  2. 老版本 Redis 无法兼容新版本 RDB。

RDB 优点:

  1. 文件紧凑,适合备份,全量复制场景。例如每 6 小时执行 bgsave,保存到文件系统之类的。
  2. Redis 加载 RDB 恢复数据远远快于 AOF。

四、问题排查和性能优化

Redis 持久化是影响 Redis 性能的高发地,也是面试中常问的问题。

1、fork 操作

当 Redis 做 RDB 或者 AOF 重写时,必然要进行 fork 操作,对于 OS 来说,fork 都是一个重量级操作。而且,fork 还会拷贝一些数据,虽然不会拷贝主进程所有的物理空间,但会复制主进程的空间内存页表。对于 10GB 的 Redis 进程,需要复制大约 20MB 的内存页表,因此 fork 操作耗时跟进程总内存量息息相关,再加上,如果使用虚拟化技术,例如 Xen 虚拟机,fork 会更加耗时。

一个正常的 fork 耗时大概在 20毫秒左右。为什么呢,假设一个 Redis 实例的 OPS 在 5 万以上,如果 fork 操作耗时在秒级,那么僵拖慢几万条命令的执行,对生产环境影响明显。

我们可以在 Info stats 统计中查询 latestforkusec 指标获取最近一次 fork 操作耗时,单位微秒。

如何优化:

  1. 优先使用物理机或者高效支持 fork 的虚拟化技术,避免使用 Xen。
  2. 控制 redis 实例最大内存,尽量控制在 10GB 以内。
  3. 合理配置 Linux 内存分配策略,避免内存不足导致 fork 失败。
  4. 降低 fork 的频率,如适度放宽 AOF 自动触发时机,避免不必要的全量复制。

2、子进程开销
fork 完毕之后,会创建子进程,子进程负责 RDB 或者 AOF 重写,这部分过程主要涉及到 CPU,内存,硬盘三个地方的优化。

  1. CPU 写入文件的过程是 CPU 密集的过程,通常子进程对单核 CPU 利用率接近 90%。如何优化呢?既然是 CPU
    密集型操作,就不要绑定单核 CPU,因为这样会和父 CPU 进行竞争。同时,不要和其他 CPU
    密集型服务不是在一个机器上。如果部署了多个 Redis 实例,尽力保证统一时刻只有一个子进程执行重写工作。

  2. 内存子进程通过 fork 操作产生,占用内存大小等同于父进程,理论上需要两倍的内存完成持久化操作,但 Linux 有 copy on
    write 机制,父子进程会共享相同的物理内存页,当父进程处理写操作时,会把要修改的页创建对应的副本,而子进程在 fork
    操作过程中,共享整个父进程内存快照。即——如果重写过程中存在内存修改操作,父进程负责创建所修改内存页的副本。这里就是内存消耗的地方。如何优化呢?尽量保证同一时刻只有一个子进程在工作;避免大量写入时做重写操作。

  3. 硬盘 硬盘开销分析:子进程主要职责是将 RDB 或者 AOF 文件写入硬盘进行持久化,势必对硬盘造成压力,可通过工具例如 iostat,iotop 等,分析硬盘负载情况。

如何优化:

1.不要和其他高硬盘负载的服务放在一台机器上,例如 MQ,存储。

2.AOF 重写时会消耗大量硬盘 IO,可以开启配置 no-appendfsync-on-rewrite,默认关闭。表示在 AOF 重写期间不做 fsync 操作。

3.当开启 AOF 的 Redis 在高并发场景下,如果使用普通机械硬盘,每秒的写速率是 100MB左右,这时,Redis 的性能瓶颈在硬盘上,建议使用 SSD。

4.对于单机配置多个 Redis 实例的情况,可以配置不同实例分盘存储 AOF 文件,分摊硬盘压力。

3、AOF 追加阻塞
当开启 AOF 持久化时,常用的同步硬盘的策略是“每秒同步” everysec,用于平衡性能和数据安全性,对于这种方式,redis 使用另一条线程每秒执行 fsync 同步硬盘,当系统资源繁忙时,将造成 Redis 主线程阻塞。
流程图如下:
在这里插入图片描述
通过上图可以发现:everysec 配置最多可能丢失 2 秒数据,不是 1 秒;如果系统 fsync 缓慢,将会导致 Redis 主线程阻塞影响效率。

问题定位:

  1. 发生 AOF 阻塞时,会输入日志。用于记录 AOF fsync 阻塞导致拖慢 Redis 服务的行为。
  2. 每当 AOF 追加阻塞事件发生时,在 info Persistence 统计中,aofdelayedfsync
    指标会累加,查看这个指标方便定位 AOF 阻塞问题。
  3. AOF 同步最多运行 2 秒的延迟,当延迟发生时说明硬盘存在性能问题,可通过监控工具 iotop 查看,定位消耗 IO 的进程。

4、单机多实例部署
Redis 单线程架构无法充分利用多核CPU,通常的做法是一台机器上部署多个实例,当多个实例开启 AOF 后,彼此之间就会产生CPU 和 IO 的竞争。

如何解决这个问题呢?
让所有实例的 AOF 串行执行。
我们通过 info Persistence 中关于 AOF 的信息写出 Shell 脚本,然后串行执行实例的 AOF 持久化。
整个过程如图:
在这里插入图片描述

五、持久化恢复

AOF 和 RDB 文件都可以用于服务器重启时的数据恢复,具体流程如下图:

从图中可以看出优先加载 AOF,当没有 AOF 时才加载 RDB。当 AOF 或者 RDB 存在错误,则加载失败。

总结

本文主要讲了 Redis 的持久化相关功能,持久化一直是影响 Redis 性能的高发地,也是面试中经常被问到的。包括 RDB 相关的特定和优缺点,AOF 的优缺点,事实上,由于 RDB 的数据实时性问题,目前用 AOF 比较多了。而持久化恢复也是优先 AOF。
关于持久化的问题排查,就很麻烦了,但无非几个方面,fork 耗时,子进程的 CPU,内存,硬盘开销,AOF 的同步阻塞,单机多实例部署。

喜欢的小伙伴可以给博主点点赞!

Go重写Redis中间件 - Go实现Redis持久化 Go重写Redis中间件项目记录 阅读详情

相关推荐

【论文阅读】2021-(Pidinet)Pixel Difference Networks for Efficient Edge Detection

文章目录摘要1. Introduction 摘要 motivations: 基于CNN的边缘检测的高性能是通过一个大的预训练CNN主干来实现的,该主干占用大量内存和能量。传统边缘检测器(如Canny、Sobel和LBP)很少被研究。 contributions: 提出了一种简单、轻量级但有效的架构,称为像素差分网络(PiDiNet),用于有效的边缘检测。PiDiNet采用了新颖的像素差卷积,将传统的边缘检测算子集成到现代CNN中流行的卷积运算中,以增强任务性能。 experiments: 在BSDS500

轻舟的万重重山 1万+

Docker-Selenium会话持久化实战:基于Redis实现浏览器状态恢复

在分布式自动化测试与数据抓取场景中,会话管理是保障测试连续性和效率的核心技术。其原理在于通过拦截和存储浏览器会话的关键状态数据(如Session ID、Cookies、页面上下文),实现测试进程的可恢复性。这项技术的核心价值在于将无状态的浏览器会话转变为有状态的测试资产,从而显著提升长流程测试的稳定性和调试效率。典型的应用场景包括需要多步骤登录、复杂状态交互的端到端测试以及分布式Selenium Grid环境。本文以Redis这一高性能内存数据库为例,深入探讨了如何通过事件监听机制和外部存储,解决Docke

weixin_30423977的博客 392

体系结构学习-6-超标量处理器

 MIPS32-5段流水线采用了指令级并行方式(5个流水段同时运行5条指令)提升系统吞吐率,是一种标量处理器(CPI≥1CPI \ge 1CPI≥1),但是一个周期一条指令以及无法满足现代计算机需求了。 超标量处理器(Superscalar) 1、基本思想:增强指令集并行,让每个周期执行更多指令,实现 CPI<1CPI<1CPI<1 。(IPC=1/CPIIPC = 1...

qq_40891899的博客 1213

redis 持久化和恢复

redis 持久化和恢复

weixin_42904386的博客 1191

Mathcad在LLC谐振变换器设计中的公式推导实战

本文通过Mathcad软件,详细演示了LLC谐振变换器设计的核心公式推导实战。文章阐述了如何利用Mathcad作为“会思考的草稿纸”,从定义基本参数、应用基波近似法(FHA)模型,到逐步推导电压增益公式及确定工作边界频率(fmin, fmax),并展示了如何通过动态参数扫描进行优化设计,帮助电源工程师高效、直观地完成理论计算,为后续仿真与实现奠定坚实基础。

q1w3e5r7t9y的博客 296

【即插即用模块】Mamba篇 | CVPR 2025 | MaIR:新型Mamba扫描方式+通道混洗注意力,全任务涨点!

MaIR是一种新型图像恢复模型,通过嵌套S形扫描策略(NSS)和序列混洗注意力(SSA)改进传统Mamba方法。NSS采用条纹区域划分和S形扫描路径,既保留图像局部性又维持空间连续性;SSA通过通道洗牌和门控机制增强特征聚合。该模块创新性地融合多路径选择性扫描、深度卷积和注意力机制,在保持O(N)计算复杂度的同时,显著提升超分辨率和去噪等任务的性能表现(PSNR提升0.2-0.5dB)。代码实现包含特征洗牌、组卷积等关键操作,适用于高分辨率视觉任务,可作为即插即用组件替代传统自注意力模块。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1165

REDIS 持久化和REDIS 数据恢复

的写入操作都记录在一个追加类型的文件中,用于恢复数据。其优点是数据丢失的风险较。:每次发生写入操作时都会执行同步,会影响服务器的写入性能,但数据保护程度较高。:每秒执行一次同步操作,折中选项,既保证了写入性能又保障了数据安全。到硬盘上的一个快照文件,用于进行备份和恢复。使用命令行save命令直接执行一次rdb持久化。步骤1.在redis.conf配置中进行设置。文件而言,文件体积更大,恢复速度更慢。性能高,缺点是在最近一次。一、REDIS 持久化。rdb持久化恢复数据。aof持久化恢复数据。

weixin_44195169的博客 757

三菱FX5U-PLC建立CClink的IO通讯

最新需要用三菱的FX5U的PLC搭建一个CClink通讯,PLC做主站,控制CClink从站的IO,下面2个输入模块AJ65SBTB1-32D,两个输出模块AJ65SBTB1-32T。3、在右侧的部件,选择网络模块:FX5-CCL-MS,CC-link主站模块。依次把加入两个AJ65SBTB1-32D,两个AJ65SBTB1-32T。7、基本设置,网络配置设置,链路刷新设置,设置好下面参数,应用。6、基本设置,网络配置设置,CC-Link配置设置。8、部件选择,模块,右键,添加模块标签。

wzz418550729的博客 1001

Redisc持久化机制浅谈

​。

weixin_54881347的博客 717

DSPy 入门: 再见提示,你好编程

DSPy("Declarative Self-improving Language Programs (in Python)",发音为 "dee-es-pie")[1] 是斯坦福大学 NLP 研究人员开发的 "基础模型编程 "框架。它强调编程而非提示,并将构建基于 LM 的管道从操作提示转向编程。因此,它旨在解决构建基于 LM 应用程序时的脆弱性问题。DSPy 还将程序的信息流与每一步的参数(提示和 LM 权重)分离开来,为构建基于 LM 的应用程序提供了更系统的方法。

具身机器人和通用AI 3486

第67步 时间序列建模实战:ARIMA建模(Stata)

第67步 时间序列建模实战:ARIMA建模(Stata)

Jet4505的博客 6820

面试中经常被问到的 Redis 持久化与恢复,该如何解决?

点击上方“Java之间”,选择“置顶或者星标”你关注的就是我关心的!作者:程序猿的内心独白一、前言本文主要讲了 Redis 的持久化相关功能,持久化一直是影响 Redis...

Java之间 2761

【华为OD技术面试手撕真题】3、小行星碰撞 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)

小行星碰撞,本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C & C++& Java & Python & JS),思路分析都非常详细, 实现最低的时间复杂度和高通过率,每个解题思路超过百字,内含各个编程语言的八股文面试题,欢迎大家订阅学习, 代码可以直接运行使用,全网限时最低价,持续更新

KJ.JK 8170

Redis持久化之内存快照:宕机后,Redis如何实现快速恢复?

Redis持久化之内存快照:宕机后,Redis如何实现快速恢复?引言给哪些内存数据做快照快照时数据能修改吗可以每秒做一次快照吗 引言 AOF 日志的好处,是每次执行只需要记录操作命令,需要持久化的数据量不大。但是,也正因为记录的是操作命令,而不是实际的数据,所以,用 AOF 方法进行故障恢复的时候,需要逐一把操作日志都执行一遍。如果操作日志非常多,Redis 就会恢复得很缓慢,影响到正常使用。 Redis还有另一种持久化方法:内存快照。所谓内存快照,就是指内存中的数据在某一个时刻的状态记录。 和 AOF 相

香农三定律的博客 1225

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Redis 持久化 -- 实现数据恢复

Redis 作为一个内存高速数据库, 全称为:Remote Dictionary Server (远程数据服务),使用C语言编写,Redis是一个key-value存储系统(键值存储系统),支持丰富的数据类型,如:String、list、set、zset、hash,可用于缓存,事件发布或订阅,高速队列等场景。使用C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化 疑问: 了解计算机的小伙伴都有了解过内存(RAM), 在计算机内是用来存贮和保存数据的, 作为

wml_sing的博客 275

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

go-redis备份恢复:数据持久化与灾难恢复

Redis作为内存数据库,数据持久化和灾难恢复是生产环境中的关键需求。go-redis作为Go语言的Redis客户端库,提供了完整的备份恢复功能支持。本文将深入探讨如何使用go-redis实现Redis数据的备份、恢复和灾难恢复策略。 ## Redis持久化机制概述 Redis提供两种主要的数据持久化方式: ### RDB(Redis Database)持久化 - **快照方式**:在指定时...

gitblog_01144的博客 651

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Redis的持久化详解

Redis的持久化,Redis是一个基于内存的数据库,它的数据是存放在内存中,内存有个问题就是关闭服务或者断电会丢失。Redis的数据也支持写到硬盘中,这个过程就叫做持久化。RDB(Redis DataBase):简而言之,就是在指定的时间间隔内,定时的将 redis 存储的数据生成Snapshot快照并存储到磁盘等介质上;AOF(Append Of File):将 redis 执行过的所有写指令记录下来,在下次 redis 重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。

怪咖@的博客 3万+

Redis-10数据持久化与恢复

本文摘要:Redis数据持久化提供RDB快照和AOF日志两种方式。RDB通过定时保存二进制快照实现高效备份。AOF记录所有写操作命令,支持每秒刷盘(everysec)平衡性能与可靠性,可配置自动重写压缩日志。混合持久化结合两者优势,使用RDB作为AOF前导提升恢复速度。关键注意事项包括:根据业务场景选择持久化策略,定期验证备份文件可恢复性,重要数据需设置多级备份。恢复流程应包含停写、备份、替换文件等标准步骤,并通过演练确保可靠性。

MmmSC的博客 2044

Redis如何开启aof进行持久化?Redis的持久化

觉得对您有帮助,点个赞加关注,不迷路!!! 不懂的或者觉得我表达的知识点不对的地方欢迎评论区留言 Redis如何开启aof进行持久化?简单说下持久化aof是什么开启:查看 简单说下持久化 Redis的所有数据都是保存在内存中,redis崩掉的话,会丢失。Redis持久化就是把数据保存到磁盘上(可永久保存的存储设备中),以便数据恢复。 不是所有的redis都要持久化 某些情况我们只需要当做缓存使用就可以不持久化,比如当热点数据的缓存,session的共享等。 只做缓存,如果你只希望你的数据在服...

weixin_48093247的博客 2766

redis之AOF持久化过程

redis之AOF持久化过程

泉眼和溪流的关系,大概是泉眼会被溪流一点一滴的占据 579

Redis(1)——持久化

Redis提供RDB和AOF两种持久化策略:RDB通过定期内存快照实现高效备份,支持手动/自动触发,但存在数据丢失风险;AOF通过记录写命令实现实时持久化,支持重写机制优化文件体积。两者各有优劣:RDB恢复速度快但实时性差,AOF数据更完整但恢复较慢。Redis4.0引入混合持久化,结合二者优势。默认优先使用AOF恢复数据,确保数据完整性。持久化机制既保证了Redis内存操作的高效性,又实现了数据的持久存储。

Yoko_999的博客 718

Redis持久化机制

Redis是基于内存的nosql数据库,数据一般是存储于内存中,想让内存数据保存到磁盘中,我们需要利用Redis的持久化机制。Redis的持久化机制用于将内存中的数据保存到磁盘,以便在重启后恢复数据。RDB(Redis Database)快照AOF(Append Only File)日志在Redis4.0版本之后,引入了混合持久化(RDB + AOF)回到顶部。

weixin_40941134的博客 69

Redis持久化

在本文中,我们深入探讨了 Redis 的持久化机制。通过详细介绍 RDB、AOF 以及混合持久化这三种主流的持久化方法,我们不仅学习了它们各自的工作机制和配置策略,还探讨了它们的优缺点,以帮助读者根据自己的实际需求选出合适的持久化方式。RDB 持久化以其高效的数据恢复速度和较小的性能开销脱颖而出,适合数据备份和灾难恢复场景。AOF 持久化通过记录每个写操作确保了更高级别的数据安全性,尽管它可能导致文件体积增大和写入性能的轻微下降。

m0_62943934的博客 1993
上一篇: 入行这么久? 真正理解了缓存吗
下一篇: 这样是不是就能把系统设计好??
Formor_
博客等级 码龄7年 7粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值