与时俱进,深入原理学习——Redis 4.0新持久化机制:混合持久化

TI AWR1642实战指南:CCS调试mmWave Demo Visualizer全流程解析 本文详细解析了TI AWR1642开发板的CCS调试流程,重点介绍了mmWave Demo Visualizer的使用方法。从环境准备、版本确认到bin文件烧录、CCS工程配置,再到调试启动与结果验证,提供了全流程的实战指南,帮助开发者快速掌握AWR1642的调试技巧,避免常见错误。 阅读详情

众所周知,Redis是一个内存数据库。但它与其它内存数据库(如memcache)等有一个很大的区别,就是Redis可以持久化到磁盘。有了持久化方案,Redis就可以对数据进行备份、恢复、复制。

Redis提供了两种持久化方案:RDB和AOF。在Redis 4.0中,提供了一个新特性:两者的混合持久化。下面将介绍Redis的各种持久化方案的原理和配置。

使用info persistence命令可以查看当前所有有关持久化的信息:

                                                            

RDB

原理

RDB持久化是通过快照方式来完成的。当达到触发条件时,Redis会自动将内存中所有数据以二进制方式生成一份副本并存储在硬盘上。

在配置文件可以配置当前配置的备份文件和目录,使用config命令也可以查看和设置:

                                                      

触发条件

RDB分为主动触发和被动触发。

主动触发指的是客户端执行save和bgsave命令会进行持久化。

执行save会使Redis处于阻塞状态,不会响应任何其他客户端发来的请求,直到RDB快照文件执行完毕,需要谨慎使用。

bgsave即background save,后台保存。当执行bgsave命令时,Redis会fork出一个子进程来执行快照操作。需要注意的是,在fork子进程的过程中,Redis是阻塞的。而当子进程创建完成后,Redis就可以继续响应客户端的请求了。

子进程创建完成以后,返回“Background saving started”。子进程根据主进程的内存副本创建临时快照文件,当快照文件完成以后对原快照文件进行替换。替换完成后,子进程发送信号给主进程完成快照操作,主进程更新统计信息(info Persistence可查看),子进程退出。

                                                       

被动触发有好几种情况,下面分别介绍一下。

save m n规则触发

在指定的m秒内,Redis中有n个键发生改变,则自动触发bgsave。该规则默认在redis.conf中进行了配置,并且可组合使用,满足其中一个规则,则触发bgsave

比如save 900 1,表明当900秒内至少有1个键发生改变时候,Redis会触发bgsave操作。

flushall触发

flushall命令用于清空数据库,请慎用,当我们使用了则表明我们需要对数据进行清空,那Redis当然需要对快照文件也进行清空,所以会触发bgsave。

shutdown触发

Redis在关闭前处于安全角度将所有数据全部保存下来,以便下次启动会恢复。可以使用客户端连入执行shutdown命令,也可以直接使用脚本关闭Redis,都会在退出前先执行save。

主从复制触发

在Redis主从复制中,从节点执行全量复制操作,主节点会执行bgsave命令,并将rdb文件发送给从节点。

数据恢复

当Redis意外崩溃或者关闭再次启动时,此时AOF持久化未开启时(默认未开启),将使用RDB快照文件恢复数据。关掉Redis服务再重启,会发现日志里面有:

配置

                                

AOF

默认情况下,Redis是关闭了AOF持久化,开启AOF通过配置appendonly为yes开启,我们修改配置文件或者在命令行直接使用config set修改,在用config rewrite同步到配置文件。通过客户端修改好处是不用重启Redis,AOF持久化直接生效。

                                            

原理

如果说RDB相当于数据库的定时备份(冷备),那AOF就相当于数据库的热备。

通过前面的介绍会发现,如果使用RDB,在意外情况下,比如Redis服务突然宕机,这个时候有些内存里面的数据还没来得及刷新进磁盘,就会导致一部分数据丢失。

AOF就是用来解决这个问题的。AOF是Append Only File的缩写,AOF可以将Redis执行的每一条写命令追加到磁盘文件中,在Redis启动时候优先选择从AOF文件恢复数据。

因为每一次写操作,都需要记录到文件中,所以开启AOF持久化会对性能有一定的影响,但是大部分情况下这个影响是可以接受的,我们可以使用读写速率高的硬盘提高AOF性能。与RDB持久化相比,AOF持久化数据丢失更少,其消耗内存更少(RDB方式执行bgsve会有内存拷贝)。

AOF实现本质是基于Redis通讯协议,将命令以纯文本的方式写入到文件中。

redis协议:

首先Redis是以行来划分,每行以\r\n行结束。每一行都有一个消息头,消息头共分为5种分别如下:

+表示一个正确的状态信息,具体信息是当前行后面的字符。

-表示一个错误信息,具体信息是当前行后面的字符。

*表示消息体总共有多少行,不包括当前行,后面是具体的行数。

$表示下一行数据长度,不包括换行符长度\r\n,后面则是对应的长度的数据。

: 表示返回一个数值,后面是相应的数的字节符。

                                                         

Redis AOF持久化过程

1 追加写入

Redis将每一条写命令以Redis通讯协议添加至缓冲区aof_buf,这样的好处在于在大量写请求情况下,采用缓冲区暂存一部分命令随后根据策略一次性写入磁盘,这样可以减少磁盘的I/O次数,提高性能。

2 同步命令到硬盘

当写命令写入aof_buf缓冲区后,Redis会将缓冲区的命令写入到文件,Redis提供了三种同步策略,由配置参数appendfsync决定,下面是每个策略所对应的含义:

no:不使用fsync方法同步,而是交给操作系统write函数去执行同步操作,在linux操作系统中大约每30秒刷一次缓冲。

always:表示每次有写操作都调用fsync方法强制内核将数据写入到aof文件。

everysec:数据将使用调用操作系统write写入文件,并使用fsync每秒一次从内核刷新到磁盘。这是折中的方案,兼顾性能和数据安全,所以Redis默认推荐使用该配置。

3 文件重写(bgrewriteaof)

当开启的AOF时,随着时间推移,AOF文件会越来越大,当然Redis也对AOF文件进行了优化,即触发AOF文件重写条件的时候,Redis将使用bgrewriteaof对AOF文件进行重写。这样的好处在于减少AOF文件大小,同时有利于数据的恢复。重写策略:

重复或无效的命令不写入文件

过期的数据不再写入文件

多条命令合并写入(当多个命令能合并一条命令时候会对其优化合并作为一个命令写入,例如“RPUSH list1 a; RPUSH list1 b" 合并为“RPUSH list1 a b” )

重写

AOF文件重写过程与RDB快照bgsave工作过程有点相似,都是通过fork子进程,由子进程完成相应的操作,同样的在fork子进程简短的时间内,Redis是阻塞的,过程如图:

                                 

过程说明:

1.开始bgrewriteaof,判断当前有没有bgsave命令(RDB持久化)/bgrewriteaof在执行,倘若有,则这些命令执行完成以后再执行。

2.主进程fork出子进程,在这一个短暂的时间内,redis是阻塞的。

3.主进程fork完子进程继续接受客户端请求,所有写命令依然写入AOF文件缓冲区并根据appendfsync策略同步到磁盘,保证原有AOF文件完整和正确。由于fork的子进程仅仅只共享主进程fork时的内存,因此Redis使用采用重写缓冲区(aof_rewrite_buf)机制保存fork之后的客户端的写请求,防止新AOF文件生成期间丢失这部分数据。此时,客户端的写请求不仅仅写入原来aof_buf缓冲,还写入重写缓冲区(aof_rewrite_buf)。

4.子进程通过内存快照,按照命令重写策略写入到新的AOF文件。

4.1子进程写完新的AOF文件后,向主进程发信号,父进程更新统计信息。

4.2主进程把aof_rewrite_buf中的数据写入到新的AOF文件。

5.使用新的AOF文件覆盖旧的AOF文件,标志AOF重写完成。

重写的触发条件:

AOF文件触发条件可分为手动触发和自动触发。

手动触发:客户端执行bgrewriteaof命令。

自动触发:自动触发通过以下两个配置协作生效:

auto-aof-rewrite-min-size: AOF文件最小重写大小,只有当AOF文件大小大于该值时候才可能重写,4.0默认配置64mb。

auto-aof-rewrite-percentage:当前AOF文件大小和最后一次重写后的大小之间的比率等于或者等于指定的增长百分比,如100代表当前AOF文件是上次重写的两倍时候才重写。

Redis开启在AOF功能开启的情况下,会维持以下三个变量

记录当前AOF文件大小的变量aof_current_size。

记录最后一次AOF重写之后,AOF文件大小的变量aof_rewrite_base_size。

增长百分比变量aof_rewrite_perc。

每次当serverCron(服务器周期性操作函数)函数执行时,它会检查以下条件是否全部满足,如果全部满足的话,就触发自动的AOF重写操作:

没有BGSAVE命令(RDB持久化)/AOF持久化在执行;

没有BGREWRITEAOF在进行;

当前AOF文件大小要大于server.aof_rewrite_min_size的值;

当前AOF文件大小和最后一次重写后的大小之间的比率等于或者大于指定的增长百分比(auto-aof-rewrite-percentage参数)

数据恢复

当AOF开启时候,Redis数据恢复优先选用AOF进行数据恢复。关掉Redis服务再重启,会发现日志里面有:

配置

                             

RDB与AOF对比

RDB的优点:

RDB文件体积小,因此在传输速度上较快,适合灾难恢复。RDB使Redis性能更高,子进程处理保存工作。在恢复大数据集时比AOF恢复速度快。

AOF的优点:

数据更完整和安全,秒级数据丢失(取决于appendfsync策略)。兼容性高,因为是基于Redis通讯协议形成的明文文件,所以容易阅读,且任何版本的Redis都兼容。

混合持久化

混合持久化是Redis 4.0才有的功能。

混合持久化同样也是通过bgrewriteaof完成的,不同的是当开启混合持久化时,fork出的子进程先将共享的内存副本以RDB方式写入AOF文件,然后在将重写缓冲区的增量命令以AOF方式写入到文件,写入完成后通知主进程更新统计信息,并将新的AOF文件替换旧的的AOF文件。

简单的说:新的AOF文件前半段是RDB格式的全量数据,后半段是AOF格式的增量数据。

数据恢复

使用混合持久化后,Redis依然优先加载AOF文件。可能有两种情况:

AOF文件开头是RDB的格式,先加载RDB部分的内容,再加载剩余的AOF

AOF文件开头不是RDB的格式,直接加载整个AOF文件

配置

4.0版本的混合持久化默认关闭的,通过aof-use-rdb-preamble配置参数控制,yes则表示开启,no表示禁用,默认是no,可通过config set修改。

混合模式可以结合AOF和RDB的优点,能够快速加载的同时避免丢失过多的数据。

上位机介绍:C# 开发者的必知基础 上位机是指在工业控制系统中,位于上层、负责人机交互和数据管理的计算机/软件,与“下位机”(PLC、传感器、变频器、单片机等硬件设备)相对应,核心是“向下通信控制设备,向上展示交互数据”。下位机:一线干活的“工人”(执行采集、控制指令);上位机:指挥管理的“办公室人员”(发指令、看数据、做报表)。C#开发者掌握上位机开发的核心是“通信+UI+稳定性基础层:搞懂WinForms/WPF基础、串口/Modbus通信,能实现核心功能;进阶层:掌握分层设计、异步编程、工业级容错(断线重连、数据校验); 阅读详情

相关推荐

本地AI代码助手:智能解析大型代码库,实现自动化重构与理解

在软件开发中,大型代码库的理解与维护是常见挑战。传统方法依赖人工阅读和有限上下文工具,效率低下。通过结合检索增强生成(RAG)和多智能体(Multi-Agent)架构,现代AI工具能够智能解析代码结构,理解模块关系,并精准定位相关代码片段。这种技术不仅能提升代码探索效率,还能自动化执行重构、文档生成等任务,在遗留系统维护、快速上手新项目等场景中发挥关键作用。本文以blackboxaicode/cli为例,展示了如何利用其代码感知和Workflow Automation能力,高效处理复杂代码库。

weixin_30240349的博客 362

Redis进阶

redis进阶和一些面试题

syx050403的博客 1024

计算机国际会议中的proceedings、conference、paper、workshop、demo:如何区分与选择?

本文详细解析了计算机国际会议中的核心概念:Conference(会议)是学术交流的主舞台,Paper(论文)是研究成果的书面呈现,被接收后收录于Proceedings(会议论文集)。Workshop(研讨会)聚焦前沿细分领域,Demo(演示)则侧重系统与工具的可交互展示。文章为研究者根据自身阶段与工作类型,如何区分与选择投稿目标提供了实用指南。

weixin_29269441的博客 562

Redis持久化机制

Redis持久化机制 众所周知,Redis是一个内存数据库。但它与其它内存数据库(如memcache)等有一个很大的区别,就是Redis可以持久化到磁盘。有了持久化方案,Redis就可以对数据进行备份、恢复、复制。 Redis提供了两种持久化方案:RDB和AOF。在Redis 4.0中,提供了一个新特性:两者的混合持久化。下面将介绍Redis的各种持久化方案的原理和配置。 使用...

weixin_30827565的博客 442

onnxruntime模型部署(一)-pythonAPI

简单模型的onnx模型的导出,以及onnxruntime推理引擎的模型部署

qq_45983373的博客 4059

Transformer-Based Attention Networks for Continuous Pixel-Wise Prediction 基于Transformer注意力网络连续像素级与估计

Transformer-Based Attention Networks for Continuous Pixel-Wise Prediction 基于Transformer注意力网络的连续的像素级的

MengYa_Dream的博客 4716

Redis——数据持久化

Redis——数据持久化 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行各种刁难。在面试中有的小伙伴一问就蒙了,当然我也是其中一个,今天我就来剖一下Redis的底层,授人以鱼不如授人以渔,知道底层原理,相信对于其他的一些特性以及应用场景,大家应该都不在话下,最后希望各位读者以后能在面试中势如破竹,拿到心仪的offer Redis是一个单线程(worker单线程,6.0后是io多线程),基于内存的非关系型数据库,读写效率高,支持丰富的数据存储

qq_43278070的博客 229

CIMPro孪大师,支持 3DGS 高斯泼溅的一站式零代码数字孪生平台

高斯泼溅导入数字孪生开发引擎

2501_90821319的博客 1108

Redis持久化

Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。Redis 提供了两种持久化方式—— RDB(Redis DataBase) 和 AOF(Append Only File) ,这可以将 Redis 在内存中的数据库状态保存到磁盘里。

Wztdx的博客 948

ESP32S3 Korvo2V3四通道AEC配置实战:基于AFE的回声消除优化

本文详细介绍了在ESP32S3 Korvo2V3平台上配置四通道AEC(回声消除)的实战经验。通过AFE算法优化和硬件连接调试,实现高质量回声消除,显著提升智能音箱和会议设备的语音交互体验。重点解析了四通道配置、数据格式对齐和参数调优等关键技术要点。

elastic6hunter的博客 932

保姆级教程:用Python工具搞定MTK手机分区表(PGPT)备份与线刷引导文件生成

本文提供了一份详细的Python工具链教程,帮助用户备份MTK手机的PGPT分区表并生成线刷引导文件。内容涵盖环境配置、分区表解析、备份流程、线刷文件生成及常见问题排查,特别适合安卓玩机爱好者和开发者。通过本指南,读者可掌握MTK芯片设备的底层分区操作技术,实现安全高效的分区备份与恢复。

weixin_30394669的博客 188

Redis笔记---介绍及使用

一、Redis介绍 1:NOSQL和SQL简介 1)Redis是一款高性能的NOSQL数据库; 2)NODSQL最初指不使用SQL标准的数据库,现在泛指所有的非关系型数据库; 3)NOSQL和SQL数据库是相辅相成的,不存在相互替换的可能 4)NOSQL数据库都符合CAP定理 ...

qq_15112293的博客 247

学Simulink--环境感知场景实例:基于Simulink的毫米波雷达多目标跟踪仿真

本文介绍了基于Simulink的毫米波雷达多目标跟踪仿真系统,重点分析了FMCW雷达信号处理流程(Range/Doppler FFT、CFAR检测)和多目标跟踪算法(JPDA数据关联、EKF状态估计)。通过构建城市道路交叉场景,验证了系统在跟踪精度(位置误差<0.2m)、实时性(单帧处理24ms)和鲁棒性(ID切换率<5%)方面的性能优势,并提出了UKF滤波、多传感器融合等优化方向。该仿真系统为自动驾驶环境感知提供了实用的毫米波雷达跟踪解决方案。

amy_mhd的博客 92

Redis的持久化详解

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

怪咖@的博客 3万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Redis 中两种持久化机制详解,三面蚂蚁金服成功拿到offer

现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**

m0_57540655的博客 799

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Redis之持久化

由于Redis是内存数据库,一旦服务器进程退出,服务器中的数据库状态也会消失。为解决这个问题,Redis提供了RDB快照形式(默认)、AOF日志形式两种持久化方式,将内存中的数据保存到磁盘中,以免数据意外丢失。如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。 一、RDB持久化 默认 Redis 是会以快照 “R...

猎户星座 376

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

带你深入理解Redis持久化机制

前言: 视频看到了三十多集,对于牛腩系统从最初的一脸懵,到现在可以着手去调试,慢慢的去了解它。说多了都是废话,进入正题,总结一下途中遇到的一些小问题。 问题一:图片加载问题 图片在本项目中加载不出来,但在另外一个项中就可以加载出来,所以考虑到可能是路径的问题,于是查了一些相关的知识。 关于路径的知识: 无点无斜杠==一点一斜杠==当前文件所在目录 两点一...

张家煦的博客 2400

redis4.0之RDB-AOF混合持久化

redis4.0之RDB-AOF混合持久

wejack的专栏 2937

【转载】redis4.0之RDB-AOF混合持久化

转自阿里云开发者社区,但是原文没有标点符号,看着很难受,于是自己加了一下……原文章在此 文章目录简介RDB V.S. AOF1. RDB2. AOFRDB-AOF混合持久化aofrewrite数据恢复附录1. RDB格式的文件2.AOF格式的文件3. RDB-AOF混合持久化的文件 简介 redis有两种持久化的方式——RDB和AOF,RDB是一份内存快照,AOF则为可回放的命令日志,他们两个各有特点也相互独立。4.0开始允许使用RDB-AOF混合持久化的方式,结合了两者的优点,通过aof-use-rd.

weixin_46573227的博客 584

Redis第5讲——RDB、AOF和混合持久化机制

我们知道Redis是内存数据库,它把数据都存储在了内存中,如果Redis服务器出现了意外,比如宕机、断电等情况,那么内存中的数据就会全部丢失。所以必须有一种机制可以把内存中的数据保存到磁盘里面,为了解决这个问题,Redis提供了RDB和AOF两种持久化机制,这也是Redis的重要特性之一。在开启混合持久化的情况下,AOF重写时会把Redis的持久化数据,以RDB的格式写入到AOF文件的开头,之后的数据再以AOF的格式追加到文件的末尾。

让~学习~成为一种习惯(橡 皮 人の技术博客) 4720

Redis持久化(RDB、AOF、混合持久化)

Redis 需要持久化主要是为了保证数据的安全性和持久性,防止数据丢失Redis 持久化功能默认是开启的,这样做的目的也是为了保证程序的稳定性,防止缓存雪崩、缓存击穿等以及保证数据不丢失。若要手动关闭 Redis 持久化,需要将 RDB、AOF 和混合持久化全部关闭才行,并且关闭之后需要重启 Redis 服务才能生效。

echola_mendes的博客 2899

Redis-4.0以后的混合持久化

Redis 当前支持 aof 和 rdb 这两种持久化方式。 有些对 Redis 不是特别的了解同学误解持久化是读写数据也会到磁盘。这里辟谣一下:Redis 读写都是全内存的, 持久化数据只是作为磁盘备份, 实例重启或者机器断电的时候可以从磁盘加载到内存由于本篇博客主要是为了分析 4.0 版本的 rdb 和 aof 混合存储的实现,所以不会详细介绍 rdb 和 aof。如果有想进一步了解可参考 《...

qq_36318234的博客 8914

redis持久化文件+持久化机制(rdb和aof)+aof重写机制+redis4.0后混合持久化机制

本文将学习redis持久化文件和持久化机制(RDB、AOF) 一.redis持久化文件 redis持久化文件默认为dump.rdb和appendonly.aof,默认都在./目录下,这两个在redis.conf配置文件中有定义: # rdb持久化文件名 dbfilename dump.rdb # 工作目录。持久化文件会生成到这个目录下,可以修改为固定地址 dir ./ #是否开启aof,默认不开启 appendonly no #aof持久化文件名,默认不开启aof也不会生成aof文件 app

qq_20395245的博客 1121

Redis的持久化

1.MySQL可以保证事务中的持久性,即只要事务提交,之后无论MySQL挂了还是服务器宕机,数据都不会丢失。 2.而Redis虽然也有持久化策略,但是它缺无法保证持久性,当Redis挂了,往往都会丢失一定的数据。 造成这两种的区别就是它们的持久化策略不同

tazj666的博客 1000
上一篇: 【网络】网络基础知识总结(包括TCP/IP协议、ARP、UDP等)
下一篇: [MySQL高级](一) EXPLAIN用法和结果分析
chenrui310
博客等级 码龄15年 165粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值