redis之AOF和RDB持久化

article/2025/8/29 17:38:40

写在前面

在这里插入图片描述
redis数据存储在内存,为了避免服务器重启或者是宕机导致数据全部丢失,提供了数据持久化机制,有AOF(Append Only File)和RDB,接下来我们分别看下。

1:AOF

如下是我本地环境生成aof文件:
在这里插入图片描述

1.1:AOF日志的实现

首先我们需要配置appendonly yes来打开AOF持久化,之后当我们执行完数据修改命令后,redis就会将命令记录到aof文件中,这个过程不同于MySQL的WAL 机制(MySQL要解决主要问题数据的安全存储,而redis要解决的主要问题是高性能的数据存取),在写数据之前先写日志,redis是写数据之后再写日志,这样做的其中一个原因是可以不用对命令本身的语法进行校验了(既然都执行成功了,肯定语法没有问题),该过程如下图:

在这里插入图片描述

如执行命令set aa bbbb则生成的aof日志如下:

*3
$3
set
$2
aa
$4
bbbb

含义如下:

*3:命令由3部分组成
$数字:代表接下来是命令的一部分,数字代表该部分的长度

通过以上信息可以反推出命令set aa bbbb,就可以用来备份和恢复数据了。另外针对aof的写回策略提供了若干个参数来控制,接下来继续看下。

1.2:写回策略

目前redis的写回策略有三种,通过配置项appendfsync设置,如下:

Always:同步写回,使用主线程,所以会影响到主线程的性能。
Everysec:每秒写回,先将命令写到aof的缓冲区,然后其他线程每隔一秒写到aof文件。
No:操作系统控制写回,命令仅仅写道aof缓冲区,由操作系统控制写到aof文件。

对比如下表:
在这里插入图片描述

随着越来越多的命令写入到aof文件,aof文件会变得越来越大,而aof文件的不断增大可能会产生如下的问题:

1:达到了操作系统对单文件大小的限制,从而无法继续写入
2:文件增大之后数据写入的速度会变慢,影响写入性能
3:文件过大,数据恢复的速度慢

为了解决以上可能的问题,redis提供了AOF重写机制

1.3:AOF重写机制

aof重写动态图

aof重写机制的原理是多合一,即将多个命令合并成一个命令,因为可能会对一个key重复操作多次,所以同一个key的操作命令会被记录多次,但是对于恢复数据而言,只需要最终的一个数据状态就行了,所以根据数据当前的状态反向生成一条命令即可,这就是多合一的过程,如下图对一个list的多次操作执行重写的过程:

在这里插入图片描述
为了完成AOF重写过程,redis会fork处一个新的子进程bgrewriteaof,并将当前内存中的数据拷贝一份,然后使用当前最新的数据生成对应的命令,并写到一个新的aof文件中,这个过程就是AOF重写,可以参考下图:
在这里插入图片描述

aof重写完成后,就可以使用新的aof文件替换旧的aof文件了。

2:RDB

如下是我本地生成rdb文件:
在这里插入图片描述
前面我们分析了AOF持久化,但这种方式有一个问题,就是当修改命令变多时会导致文件过大,从而导致数据恢复速度慢。这个问题我们可以通过RDB(redis database)来解决。

2.1:原理和配置

  • 原理
    Redis通过定时任务扫描数据的变化是否满足某个规则,如果是满足了规则则使用操作系统提供的相关机制,则调用fork()创建子进程,对redis当前的内存空间生成dump.rdb快照文件,该文件存储了内存数据对应的二进制数据,可以直接加载到内存中来恢复redis的数据,恢复速度快。
  • 配置策略
    redis有两种配置策略,一种是手动触发策略,另外一种是自动触发策略,其中自动触发策略可以通过save,bgsave命令来手动触发,前者会使用主线程执行备份,如下:
127.0.0.1:6379> SAVE
OK
127.0.0.1:6379> BGSAVE
Background saving started
127.0.0.1:6379>  LASTSAVE
(integer) 1611298430

注意:LASTSAVE 命令用于查看 BGSAVE 命令是否执行成功。

自动触发策略通过如下配置:

save 900 1
save 300 10
save 60 10000

以上配置的格式是save 时长 修改次数,以上配置的含义是如果是在900内发生至少一次更新,或者在300内发生至少10次更新,或者是60秒内发生至少10000次更新,则执行bgsave生成rdb快照文件,并且生成文件后用于触发策略的计数和计时都会重置。

2.2:复制都有哪些问题

在进行复制的时候,还允许数据更新吗?如果是允许更新的话,就会有数据一致性的问题,如果是不允许更新的话,则会影响正常的数据更新。当然,影响正常的数据更新肯定是不允许的,因为会严重影响业务,甚至可能会出现线上事故,而数据一致性的问题更加不允许了,如果是后续使用其恢复数据的话,问题就更大了,所以只需要解决允许更新时有数据一致性的问题就可以了,redis的做法是使用COW(将要更新的数据copy出一份,直接更新copy的那份)机制,即更新时将更新目标对应的内存页复制出来一份,对复制的内存页执行更新,则原始数据不会受到影响,待rdb生成完毕后,再将COW的内存页重新写回到原始内存页就行了(这个过程很快),这样就能解决数据一致性的问题了,参考下图:

在这里插入图片描述
好了,现在我们已经能够在不影响客户端更新的情况下获取符合数据一致性要求的快照了,但是更新时时刻都在发生的,那么在这次快照生成之后多久之后再次生成呢,如果是频率过慢,比如十分钟一次,如果发生宕机,则上次快照到宕机时刻的所有数据都会丢失,如果是过快,比如一秒一次,这样可以大大减少宕机造成的数据丢失,但是会对系统的IO等资源造成比较大的压力,而且创建子进程的fork操作也是会阻塞主线程,因此也会影响到正常的数据操作,其实我们只需要处理好两次快照之间的数据就行了,一种方案是记录修改日志,即记录对数据都做了什么修改,如下图:

在这里插入图片描述

这种方案也没有太大问题,但是在redis4.0中提供了更好的一种方案,即通过rdb和aof混用的方式,就巧妙的将这个问题解决了,即两次快照空隙的数据修改通过aof日志方式记录,则就既能使用到rdb恢复速度快的优势,也能够规避aof文件过大带来的问题,发挥其记录简单的优势,此时,rdb就是全量备份,而aof就是增量备份,二者混用执行可能如下图:
在这里插入图片描述
真是一种完美的解决方案,可以在线上起来。

写在后面

参考文章列表:

Redis RDB持久化详解(原理+配置策略) 。


http://chatgpt.dhexx.cn/article/Br8g41Wb.shtml

相关文章

AOFRDB

序言 主要用于查看不同备份模式可以调优的一些方式. RDB: Redis服务器在规定时间内将内存中的数据保存到指定路径的文件中,服务器重启的时候直接将RDB文件读取到内存中AOF:Redis服务器以日志的形式追加所有的REDIS操作,服务器重启的时候读取AOF文件依次执行一遍. 关于RDB最主…

RDB持久化触发机制

RDB持久化 触发机制 手动触发 手动触发分别对应save和bgsave命令: save命令:同步,在主线程中保存快照;阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上…

Redis RDB 和 AOF

导读 RDB 和 AOF 对比: 持久化方式选择 如果对数据安全性要求极高,应该同时使用两种持久化方式。 如果可以承受若干时间内的数据丢失,可以只使用 RDB 持久化。 不建议只使用 AOF 持久化,因为定时生成 RDB 快照(s…

java读取rdb_剖析Redis RDB文件

通过redis-cli中执行save或者bgsave可以得到RDB文件(文件名由配置文件中dbfilename指定,例如dbfilename "dump.rdb"),这个文件包含Redis实例中全量的数据,那么dump.rdb的文件格式大概是什么样的呢? RDB文件定义 获取RDB…

Redis RDB文件解析

Redis RDB是什么 Redis rdb是Redis快照存储持久化方式,具体就是将Redis某一时刻的内存数据保存到硬盘的文件当中,默认保存的文件名为dump.rdb,而在Redis服务器启动时,会重新加载dump.rdb文件的数据到内存当中恢复数据&#xff0c…

RDB 持久化详解

文章目录 持久化的执行SAVE:阻塞服务器并创建RDB文件BGSAVE:以非阻塞方式创建RDB文件通过配置文件自动创建RDB文件查看最近持久化时间 RDB优化配置1. save2. stop-write-on-bgsave-error3. rdbcompression4. rdbchecksum5. sanitize-dump-payload6. dbfi…

RDB持久化

RDB持久化 一、RDB快照实现二、快照用法三、执行快照时的数据修改四、RDB 和 AOF 合体 一、RDB快照实现 Redis 是内存数据库,但是它为数据的持久化提供了两个技术。 分别是「 AOF 日志和 RDB 快照」。 这两种技术都会用各用一个日志文件来记录信息,但…

RDB底层原理

Redis服务器自动保存功能的实现原理及文件中的各个组成部分 因为Redis是内存数据库,它将自己的数据库状态储存在内存里 面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面, 那么一旦服务器进程退出,服务器中的数据库…

Redis持久化原理(RDB)

在上一篇文章中,介绍了Redis的内存模型很重要,从这篇文章开始,将依次介绍Redis高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。 本文将先说明上述几种技术分别解决了Redis高可用的什么问题;然后详细介绍Redis的…

运行程序时出现 应用程序无法启动,因为应用程序的并行配置不正确

最近发布给客户的程序中,双击exe程序出现“应用程序无法启动,因为应用程序的并行配置不正确”,下面提示使用sxstrace跟踪调试应用程序运行时需要的动态库的版本和路径。 于是有以下操作: 步骤: 1.利用管理员身份运行命…

谷歌浏览器出现应用程序无法启动,因为应用程序的并行配置不正确....(亲测完美解决)

电脑开机 完整报错提示为: 应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行 sxstrace.exe 工具。 刚开始也在网上找了N久的解决方案(如:启动windws Mod…

成功解决“tesseral应用程序无法打开,因为运行程序并行配置不正确”

目前网上流传的两种方法1是启动Windows Modules Installer并重启 但我的并没有处于禁用状态。 第二种是查看日志安装对应库,比较麻烦。 无意中发现第三种方式,操作更为简单。 我的tesseral版本是7.0.6,初次打开会提示如题报错,…

chrome 应用程序无法启动,因为应用程序的并行配置不正确

方法一: 开始 - 运行(输入services.msc)- 确定或回车,打开:服务(本地); 我们在服务(本地)窗口找到:Windows Modules Installer服务&#…

exe应用程序无法启动,因为应用程序的并行配置不正确

问题:exe应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行 sxstrace.exe 工具。 原因查找: 1)开始→所有程序→附件→右键命令提示符→以管理员身份运…

STM32CubeMx开发之路—在线升级OTA

文章目录 运行环境简介基础知识(1/4)STM32中的程序在哪儿?进行分区总体流程图 BootLoader程序流程图分析程序编写和分析 App程序流程图分析程序编写和分析Ymodem协议代码分析 结果验证代码的下载BootLoader的下载App1的下载生成App2的.bin文件使用Xshell进行文件传输 总结源代…

基于FPGA的在线升级

基于FPGA的在线升级 在线升级的意义在线升级的策略整体框架总结参考文献结束语 在线升级的意义 首先什么是FPGA的在线升级? 所谓FPGA的在线升级其实就是不对FPGA进行常规意义下的下载程序,便可以通过一些手段更新FPGA中的程序,一般用到的工具…

MCU通过UART实现OTA在线升级流程

关注星标公众号,不错过精彩内容 素材来源 | 网络 OTA升级已经不是什么新鲜事,现在大多数物联网终端设备,基本具备这个功能。 今天以AT32为例给大家分享一下OTA升级的详细流程。 概述 空中下载技术OTA(Over-the-Air Technology&…

Qt 在线升级功能

开源QSimpleUpdater是一个Qt在线升级模块 ,但是QSimpleUpdater 由于使用了很久以前的版本,并且近几年没有维护,因此其内部好多Qt的widget文件,这些QWidget与项目的整体风格不符合,说白了就是很丑,现在用QML…

stm32-IAP(在线升级程序)

第一章 背景知识 什么是IAP? IAP的知识网上的各种资料也说的比较明白,在此简单介绍一下。IAP( In Application Programming)即在线应用编程,也就是用户可以使用自己的程序对单片机的User Flash的某一区域&#xff08…

【Android】轻松实现 APK 在线升级

【Android】轻松实现 APK 在线升级 APK 在线升级 APK 在线升级几乎是所有程序必备的功能。 在线升级功能能解决已有的问题并提供更丰富的新功能。 基本的流程是: 检测到新版本信息弹出升级提示窗口点击 No 不进行升级,完毕!点击 Yes 后台…