Redis持久化策略之RDB与AOF
文章目录
- 1.RDB
- 1)基本介绍
- 2)自动触发
- 3)手动触发
- 4)RDB文件
- 5)优点缺点
- 2.AOF
- 1)基本介绍
- 2)使用方式
- 3)工作流程
- 4)重写机制
- 5)AOF文件
- 6)优点缺点
- 3.RDB + AOF
我们都知道,redis 是一个基于内存的数据库。基于内存的好处是访问速度快,缺点是“不持久”——当数据库重启时内存中原先的数据全都会被清空。然而小孩子才做选择,redis 说我全都要:当插入一份新的数据时,在内存中会存储一份,在磁盘中也会存储一份(当然具体怎么写 redis 有自己的策略,从而保证足够的效率)
当要访问数据时,直接从内存中获取;当 redis 重启时,可以根据磁盘中的备份来恢复。虽然会消耗更多的磁盘空间,然而磁盘资源在计算机世界里可以说是最廉价的了,这样的开销并不会带来多大的成本。
Redis官网中列出了如下四种持久化策略:

1.RDB
1)基本介绍
RDB(Redis Database)是 redis 中默认使用的持久化策略,它的思想是定期对 redis 进行一次全量备份,备份数据是二进制的方式存储的,其存储路径由配置文件 redis.conf 指定。
RDB持久化过程分为自动触发和手动触发,下面分别介绍
2)自动触发
自动触发有三种情况:
-
在m秒内数据集发生了n次修改则自动触发。m和n的具体数值由配置文件决定,在我当前的配置文件下有3中选项

注意,m与n是并且的关系,只有同时满足才会被触发。例如上面的触发条件翻译为:距离上一次备份过去 60s 时,至少发生了 10000 次修改则触发 rdb 备份,另外两条同理。如果你想禁止自动生成 rdb 快照,你可以这样修改配置文件:save "" -
从节点进行全量复制操作时,主节点自动进行RDB持久化,随后将RDB文件内容发送给从结点
-
执行shutdown命令关闭Redis时,执行RDB持久化。所以说正常退出 Redis 服务器前都会对当前的数据进行一次备份
3)手动触发
触发命令:
手动出发 RDB 的指令有两个:
- save:阻塞当前 Redis 服务端,直到RDB过程完成为止。对于内存比较大的实例,可能会造成 Redis 服务端的长时间阻塞,影响正常的业务请求,因此不推荐使用
- bgsave:Redis 通过 fork() 指令创建子进程,由子进程完成 RDB 的持久化过程。阻塞过程只会发生在 fork 阶段,但是得益于写时拷贝机制,创建子进程的时间一般很短,影响不大,因此推荐使用
执行流程:

-
执行
bgsave命令后,Redis 父进程会首先检查是否有正在执行 RDB/AOF 备份的子进程,如果有 bgsave 就立刻返回,间隔时间这么短,再开一个子进程备份的意义不大。 -
父进程执行 fork 创建子进程。fork过程中父进程可能会被阻塞,最近一次的fork操作耗时可以在redis 服务端使用
info指令查看,单位为微秒。

-
父进程 fork() 完成后,就可以继续接受客户端的业务请求,而将备份的任务交给子进程完成
-
子进程会向一个临时的快照文件写入 redis 备份数据,当备份完成时,会删除历史的 dump.rdb 并将该快照文件重命名为 dump.rdb,从而保证了自始至终只有一份 rdb 备份文件
-
子进程通过信号通知父进程 rdb 备份工作完成
实验验证:
打开 /var/lib/redis (具体路径因人而异,见配置文件)下的 dump.rdb 文件,正如我们所预期的一样,文件以二进制的形式存储,所以呈现出来的都是人眼不能识别的乱码:

使用 stat 指令记录下此时的 innode 编号

执行 bgsave 手动完成 rdb 备份时,根据 Inode 编号我们就可以发现文件已经被替换了。

4)RDB文件
保存:
RDB文件保存在 dir 配置指定的目录(默认/var/lib/redis/)下,文件名通过 dbfilename配置(默认dump.rdb)指定。

可以通过执行 config set dir{newDir} 和 config set dbfilename{newFilename} 运行期间动态执行,当下次运行时RDB文件会保存到新目录
压缩:
Redis默认采用 LZF 算法对生成的 RDB 文件做压缩处理,压缩后的文件远远小于内存大小,默认开启,可以通过参数 config set rdbcompression{yes|no} 动态修改

校验:
dump.rdb 里面的数据不要乱改,修改后可能看不出什么影响,也可能会导致数据错误,甚至有可能导致 redis 服务端启动失败。
-
我们手动向 dump.rdb 文件追加数据,然后重启 redis 服务端,观察结果。使用 keys * 发现似乎没什么影响

-
我们再尝试在文件中间修改,然后重启 redis 服务端,观察结果:

现在好了,连 redis 客户端也连不上了,看看日志文件怎么说(日志文件路径同样可以在配置文件中找到,对应 logfile 配置项)

日志说的很明白了,都是 RDB 文件格式不对惹的祸。当 dump.rdb 被恶意修改时,其结果是不可预期的。对此,我们可以使用 redis 提供的 rdb 文件格式检查工具进行检查:


5)优点缺点
优点:
- RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间点上的数据快照,非常适用于备份,全量复制等场景。非常适合灾难恢复,因为它是一个可以传输到远程数据中心的单一紧凑文件
- RDB 持久化策略可以最大化 Redis 的性能,因为父进程从不需要执行磁盘I/O或类似操作,一切的 IO 工作都交给了子进程完成
- 与AOF相比,RDB允许使用大数据集更快地重新启动。因为 RDB 是以二进制的方式存储数据,而 AOF 是以文本的形式记录对 redis 的各种数据操作
缺点:
- RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行 fork 创建子进程,属于重量级操作,频繁执行成本过高。 因此如果 Redis 服务端在两次备份中间异常退出了(正常退出会自动备份),那么退出前的新插入的数据就得不到持久化
- RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个RDB版本,兼容性可能有风险
2.AOF
1)基本介绍
前面谈到,RDB 最大的缺点是不能实时持久化保存数据,在两次快照之间,实时数据可能会因为 Redis 异常退出而丢失。而 AOF 则可以较好的处理实时性的问题。
AOF类似于mysql中的binlog,它会以独立日志的方式记录 Redis 服务端收到的每一条写入操作,重启时再重新执行AOF文件中的各种命令达到恢复数据的目的。 AOF 解决了数据的实时性问题,因此已经成为了 Redis 持久化的主流方式。
2)使用方式
Redis 中默认采用的持久化策略为 RDB,开启 AOF 功能需要设置配置: appendonly yes ,当RDB 与 AOF 可以同时设置,但如果开启 AOF ,Redis 在启动时就会从 AOF 中加载数据

3)工作流程
具体流程:

- Redis 客户端输入的所有指令都会被追加到 aof_buf 缓冲区中
- AOF 缓冲区根据策略定期将数据刷新到磁盘
- 随着 AOF 文件越来越大,需要定期对 AOF 文件进行重写,以达到数据压缩的目的
- 当 Redis 服务器重启时,可以加载 AOF 文件进行数据恢复
缓冲区:
AOF过程中为什么需要aof_buf这个缓冲区?Redis使用单线程响应命令,如果每次写AOF文件都直接同步硬盘,性能从内存的读写变成IO读写,必然会下降。先写入缓冲区可以有效减少IO次数。同时,Redis还可以提供三种缓冲区同步策略,让用户根据自己的需求做出合理的平衡 :
- no:由OS控制 fsync 频率。效率最高但安全性最差
- always:每一次写入都会立即进行 fsync 刷盘。效率最低,安全性最高
- everysec:每秒执行一次 fsync。兼顾安全性和效率,最常使用

虽然缓冲中的数据在刷盘前也存在丢失的风险,但是相较于 RDB,AOF的刷新频率很快,所以你最多只会丢失 1s,甚至一行命令的数据
4)重写机制
基本认识:
随着命令不断写入AOF,.aof 文件会越来越大,Redis 服务端重启的速度自然越来越慢。为了解决这个问题,Redis引入 AOF 重写机制来压缩文件体积。
重写机制就是去除冗余操作,合并相同操作的过程,虽然听起来很复杂,但实现起来却很简单,因为对于 aof 文件而言,并不需要关心中间的各种过程,只关心最后 Redis 数据库的状态,因此重写的本质是将 Redis 进程内的数据转化为写命令同步到新的 AOF文件
触发条件:
AOF 重写过程有自动触发和手动触发两种方式:
-
自动触发:触发时机由配置文件中的参数决定,两个同样是 “并且” 的关系
-
auto-aof-rewrite-min-size:表示触发重写时AOF的最小文件大小,默认为64MB -
auto-aof-rewrite-percentage:代表当前AOF占用大小相比较上次重写时增加的比例,默认为 100%,意味着至少要是上次重写体积的两倍才触发
-
-
手动触发:调用
bgrewriteaof命令
重写流程:

- 如果当前有进程已经在执行 AOF 重写,则返回一个 error。如果有进程正在执行 bgsave 命令,则 bgsave 完成后重写才会开始
- 父进程创建子进程,由子进程完成重写任务
- 父进程fork之后,继续响应其他命令:
- 所有修改操作写入 AOF 缓冲区并根据 appendfsync 策略同步到硬盘,保证旧 AOF 文件机制正确
- 同时 fork 之后的数据也要写一份到 aof_rewrite_buf 缓冲区中以保证数据的一致性(后面具体解释)
- 子进程根据内存快照,将数据以命令的形式合并到新的AOF文件中
- 子进程完成重写工作后:
- 子进程向父进程发送信号,通知父进程重写工作完成
- 父进程把 aof_rewrite_buf 内临时保存的命令追加到新 AOF 文件中
- 用新 AOF 文件替换老的 AOF 文件 (实验方法同上)
重写缓冲区
为什么需要重写缓冲区,看下面这个例子:
| 时间 | 父进程 | 子进程 |
|---|---|---|
| t1 | execute command “set key1 1” | |
| t2 | execute command “set key2 2” | |
| t3 | Create subprocess, execute AOF file rewrite | Start AOF file rewrite |
| t4 | execute command “set key1 11” | execute the rewrite operation |
| t5 | execute command “set key2 22” | execute the rewrite operation |
| t6 | …… | Complete AOF rewrite |
我们知道,进程具有独立性,子进程创建后就和父进程在数据上独立了,这就意味着子进程只会记录上图中 t3 时刻 Redis 内存中的数据。因此父进程额外开辟了一块缓冲区用于记录fork 后父进程收到的请求,在子进程完成重写后再将这块缓冲区追加到 new AOF 文件的结尾,就可以保证数据的一致性。
AOF缓冲区
为什么 fork 后父进程还要向 AOF 缓冲区写入数据呢?对于安全问题,我们往往要考虑到各种极端的情况。如果子进程还没有完成重写 Redis 服务端就异常退出了,抑或是主机掉电了,那么新 AOF 文件的内容肯定是不完整的,内存中的 aof_rewrite_buf 也已经丢失,这就意味着 fork 后插入的数据都丢失了。
因为即使 fork 后,父进程仍然要向 aof_buf 写入,并按照刷新策略定期刷新到磁盘,从而保证数据的安全
5)AOF文件
AOF命令写入的内容直接是文本协议格式。例如set hello world这条命令,在AOF文件中会追加如下文本 :

此处遵守Redis格式协议,Redis选择文本协议可能的原因:文本协议具备较好的兼容性;实现简单;具备可读性。 对于 AOF 文件,redis 同样提供了格式检查工具 redis-check-aof,这里不再重复演示。
6)优点缺点
优点:
- AOF 策略相比于 RDB 数据更加可靠。everysec 策略下,你最多损失 1s 的数据
- AOF 的重写机制在保证数据安全的前提下,避免了 AOF 文件太臃肿
- AOF 文件以文本的方式包含了各种 operations,具有较好的可读性。你甚至可以轻松的导出 AOF 文件,例如你不小心的使用
FLUSHALL删除所有数据,你也可以根据 AOF 文件恢复出FLUSHALL之前的所有数据,在没有 rewrite 的前提下。
缺点:
- AOF 文件通常比 RDB 文件体积更大
- AOF 持久化策略通常比 RDB 策略效率低。一般来说,在fsync设置为每秒一次的情况下,性能仍然很高,而在禁用fsync的情况下即使在高负载下,它应该与RDB一样快
3.RDB + AOF
Redis引入了“混合持久化”的方式,结合了 AOF + RDB 的优点:
-
按照 AOF 的方式记录每一个请求

-
在触发 AOF 重写后,就把当前内存的状态按照 RDB 二进制文件的格式写入到新的 aof 文件中(对上一个文件重写后的结果)

-
后续再进行操作仍然是以 aof 文本的方式追加到 aof 文件末尾

该功能默认开启,对应配置文件中的参数如下:

相关文章:
Redis持久化策略之RDB与AOF
文章目录 1.RDB1)基本介绍2)自动触发3)手动触发4)RDB文件5)优点缺点 2.AOF1)基本介绍2)使用方式3)工作流程4)重写机制5)AOF文件6)优点缺点 3.RDB AOF 我们都知道,redis 是一个基于内存的数据库。基于内存的好处是访问速度快,缺点是“不持久”——当数据…...
Python学习笔记--初识 Python 正则表达式
初识 Python 正则表达式 正则表达式是一个特殊的字符序列,用于判断一个字符串是否与我们所设定的字符序列是否匹配,也就是说检查一个字符串是否与某种模式匹配。 Python 自 1.5 版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正…...
webAPP基础学习
###视觉基础 part-I ####1.面试中常见的像素问题 >什么是像素? *1.什么是px? px-虚拟像素,css像素的单位 px是一个相对单位,相对于设备像素而言 >相对性 a.相对于同一个设备,css像素的可变的 css像素物理像素>会受到缩放的影响 css像素缩放倍数*单个物理像…...
RIP路由信息协议
RIP路由信息协议(Routing Information Protocol) 最先得到广泛应用的协议,最大优点是简单要求网络中的每个路由器都要维护一张表,表中记录了从它自己到其他每一个目的网络的距离RIP是应用层协议,它在传输层使用UDP,RIP报文作为UD…...
kubernetes 高可用集群
目录 一、haproxy负载均衡 二、pacemaker高可用 三、部署control-plane 四、部署worker node 实验环境 主机名 IP 角色 docker 192.168.67.10 harbor k8s1 192.168.67.11 control-plane k8s2 192.168.67.12 control-plane k8s3 192.168.67.13 control-plane k8s…...
java实现插入排序
图解 以下是Java实现插入排序的代码: public class InsertionSort {public static void main(String[] args) {int[] arr {5, 2, 4, 6, 1, 3};insertionSort(arr);System.out.println(Arrays.toString(arr)); // output: [1, 2, 3, 4, 5, 6]}public static void i…...
深度学习之基于YoloV5血红细胞检测识别系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习已经在许多领域中得到了广泛的应用,包括医疗健康领域。其中,YOLO(You O…...
8、可视化高斯滤波器并完成高斯滤波
本节一起绘制一个可视化的高斯滤波器,同时对一个彩色图像增加高斯噪声,最后通过一个高斯滤波器对图像进行降噪处理。 就像上节说的那样,滤波不是学习重点,下面通过实操了解下原理即可。 可视化高斯滤波器 高斯滤波器符合高斯分布,并且是二维高斯分布,这一点在上一节高斯…...
Linux MMC子系统 - 5.eMMC 5.1工作模式-引导模式
By: Ailson Jack Date: 2023.11.19 个人博客:http://www.only2fire.com/ 本文在我博客的地址是:http://www.only2fire.com/archives/164.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。…...
2342. 数位和相等数对的最大和 --力扣 --JAVA
题目 给你一个下标从 0 开始的数组 nums ,数组中的元素都是 正 整数。请你选出两个下标 i 和 j(i ! j),且 nums[i] 的数位和 与 nums[j] 的数位和相等。 请你找出所有满足条件的下标 i 和 j ,找出并返回 nums[i] num…...
linux如何重置root密码
目录 当我们想要重置root管理员密码时,我们可以有两种方法进行: 方法一、init方法 1、重启系统,在下图所示界面按e键 2、随后进入以下界面,、将ro修改为rw,在行末尾添加init/bin/sh。编辑 3、随后按Ctrlx启动到s…...
Java 类之 java.util.Properties
Java 类之 java.util.Properties 文章目录 Java 类之 java.util.Properties一、简介二、主要功能1、存储键值对2、读取文件与属性代码示例运行结果截图 3、设置属性并保存文件代码示例结果截图 4、遍历属性代码示例运行结果 关联博客:《基于 Java 列举和说明常用的外…...
我遇到的bug(活动)
目录 方向一:身为程序员遇到过的奔溃瞬间 方向二:如何解决遇到的奔溃瞬间 方向三:在解决完后获得的收获和体会 方向一:身为程序员遇到过的奔溃瞬间 在一个项目中,我负责实现一个复杂的图像处理算法。经过几天的努力…...
MIB 6.1810实验Xv6 and Unix utilities(3)pingpong
Mit6.S081-实验1-Xv6 and Unix utilities-pingpong问题_Isana_Yashiro的博客-CSDN博客 Write a user-level program that uses xv6 system calls to ping-pong a byte between two processes over a pair of pipes, one for each direction. The parent should send a byte to…...
压力测试总共需要几个步骤?思路总结篇
在运维工作中,压力测试是一项很重要的工作。比如在一个网站上线之前,能承受多大访问量、在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验。今天我们就来深入了解下压力测试! 1、首先,什么是压力测试&…...
03_面向对象高级_多态
多态 1. 什么是多态? “多态” 是在 “继承” 的基础上实现的一种现象,具体表现为:对象多态、行为多态。 public class HelloWorld {public static void main(String[] args) {// 1. 对象多态Human h1 new Student();Human h2 new Teach…...
【Kingbase FlySync】界面化管控平台:2.配置数据库同步之KES>KES
【Kingbase FlySync】界面化管控平台:3.配置数据库同步之KES->KES 部署KES数据库到KES数据库同步服务1.登录KFS管理平台2.开始配置数据节点信息(1)配置node1数据节点(2)配置node2数据节点 3.KFS拓扑图配置4.开始部署5.启动同步程序并查验是否运行正常 测试同步1.从node1数据…...
企业计算机服务器中了mallox勒索病毒怎么解决,勒索病毒解密文件恢复
随着科技技术的不断发展,网络技术得到了快速提升,但网络安全威胁也不断增加,近期,云天数据恢复中心陆续接到很多企业的求助信息,企业的计算机服务器遭到了mallox勒索病毒攻击,导致企业的所有业务中断&#…...
Sonar生成PDF错误Can‘t get Compute Engine task status.Retry..... HTTP error: 401
报错及修改: 报错:INFO: Can’t get Compute Engine task status.Retry… org.sonarqube.ws.connectors.ConnectionException: HTTP error: 401, msg: , query: org.apache.commons.httpclient.methods.GetMethod7a021f49 ERROR: Problem generating PD…...
storage和正则表达式
一、Storage 1.认识Storage WebStorage主要提供了一种机制,可以让浏览器提供一种比cookie更直观的key、value存储方式: localStorage:本地存储,提供的是一种永久性的存储方法,在关闭掉网页重新打开时,存…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
Python打卡训练营学习记录Day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
mq安装新版-3.13.7的安装
一、下载包,上传到服务器 https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.7/rabbitmq-server-generic-unix-3.13.7.tar.xz 二、 erlang直接安装 rpm -ivh erlang-26.2.4-1.el8.x86_64.rpm不需要配置环境变量,直接就安装了。 erl…...
PCA笔记
✅ 问题本质:为什么让矩阵 TT 的行列式为 1? 这个问题通常出现在我们对数据做**线性变换(旋转/缩放)**的时候,比如在 PCA 中把数据从原始坐标系变换到主成分方向时。 📌 回顾一下背景 在 PCA 中ÿ…...
