【Redis入门到精通七】详解Redis持久化机制(AOF,RDB)

目录

Redis持久化机制

1.RDB持久化

(1)手动触发RDB持久化

(2)自动触发RDB持久化

(3)Redis文件相关处理

(4)RDB持久化的优缺点

2.AOF持久化

(1)AOF工作流程

(2)AOF缓冲区文件同步

(3)AOF重写机制

(4)Redis启动时数据恢复流程图


Redis持久化机制

        众所周知,Redis的快主要依赖于它的数据是存储在内存当中的,数据存储和提取避免了读写硬盘这一非常耗时的操作,但是如果在运行过程中发生了进程中断,内存中的数据就会丢失,为了解决数据丢失的问题,Redis提供了RDB和AOF两种持久化机制,当Redis重启时可以利用之前持久化的文件实现数据恢复。

1.RDB持久化

       RDB 持久化是把当前进程数据⽣成快照(二进制文件)保存到硬盘的过程,触发 RDB 持久化过程分为⼿动触发和自动触发。   

(1)手动触发RDB持久化

⼿动触发分别对应 save 和 bgsave 命令:
  • save 命令:阻塞当前 Redis 服务器,直到 RDB 过程完成为止,对于内存⽐较⼤的实例造成长时间阻塞,基本不采⽤。
  • bgsave 命令:Redis 进程执⾏ fork 操作创建⼦进程,RDB 持久化过程由⼦进程负责,完成后⾃动结束。阻塞只发⽣在 fork 阶段,⼀般时间很短。
Redis 内部的所有涉及 RDB 的操作都采⽤类似 bgsave 的⽅式。

具体操作展示如下: 

在/etc/redis/redis.conf中Redis的配置文件中便可以找到Redis的工作目录Redis变会把工作时生成的文件放在这个目录下面。

下面这个配置项可以修改生成的rdb文件的名称。 

 

进行如下操作可以看到我们确实进入到了dump.rdb所在路径。 

 

打开可以看到里面是二进制文件,显示出来的即是乱码的情况 

 下面我们执行save/bgsave命令感受rdb文件的变化。

 可以看到命令生效。

(2)自动触发RDB持久化

除了⼿动触发之外,Redis 运⾏⾃动触发 RDB 持久化机制,这个触发机制才是在实战中有价值的。
  1. 使⽤ save 配置。如 "save m n" 表⽰ m 秒内数据集发⽣了 n 次修改,⾃动 RDB 持久化。
  2. 从节点进⾏全量复制操作时,主节点⾃动进⾏ RDB 持久化,随后将 RDB ⽂件内容发送给从结点。
  3. 执⾏ shutdown 命令关闭 Redis 时,执⾏ RDB 持久化。

 在配置文件中找到save配置项的相关信息,修改save后面的数字便可以自定义rdb文件自动生成的时间,可以依据实际工作需要进行修改。需要注意的是生成一次rdb文件,这个操作需要效果比较高的成本,不能让这个操作执行的太频繁。

 

(3)Redis文件相关处理

  • 保存位置: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} 动态修改。
  • 校验:如果 Redis 启动时加载到损坏的 RDB ⽂件会拒绝启动。这时可以使⽤ Redis 提供的 redis-check-dump ⼯具检测 RDB ⽂件并获取对应的错误报告

tips: 虽然压缩 RDB 会消耗 CPU,但可以⼤幅降低⽂件的体积,⽅便保存到硬盘或通过⽹络发送到从节点,因此建议开启。 

(4)RDB持久化的优缺点

  1. RDB 是⼀个紧凑压缩的⼆进制⽂件,代表 Redis 在某个时间点上的数据快照。⾮常适⽤于备份,全量复制等场景。⽐如每 6 ⼩时执⾏ bgsave 备份,并把 RDB ⽂件复制到远程机器或者⽂件系统中(如 hdfs)⽤于灾备。
  2. Redis 加载 RDB 恢复数据远远快于 AOF 的⽅式。
  3. RDB ⽅式数据没办法做到实时持久化 / 秒级持久化。因为 bgsave 每次运⾏都要执⾏ fork 创建⼦进程,属于重量级操作,频繁执⾏成本过⾼。
  4. RDB ⽂件使⽤特定⼆进制格式保存,Redis 版本演进过程中有多个 RDB 版本,兼容性可能有⻛险。

       正是因为rdb文件每次生成的时候都需要把内存中所有的数据都进行转化为二进制并存储,这个操作不可能进行的非常频繁,这就会导致rdb文件中实际存储的内容并不可能与内存中的实时相同,虽然Redis在执行正常服务停止操作的时候还会再次进行一次rdb生成操作,但是遇到特殊情况导致进程终止,还是无法保证数据一致性。为了保证数据的一致性,Redis在进行rdb持久化的同时还在进行aof持久化。

2.AOF持久化

       AOF(Append Only File)持久化:以独立日志的⽅式记录每次写命令,重启时再重新执行 AOF文件中的命令达到恢复数据的目的。AOF 的主要作⽤是解决了数据持久化的实时性,⽬前已经是Redis 持久化的主流方式。

(1)AOF工作流程

开启AOF功能需要在配置文件中配置:appendonly yes,默认不开启。AOF文件名通过appendfilename配置(默认是 appendonly.aof)。保存⽬录同 RDB 持久化⽅式⼀致,通过 dir配置指定。AOF 的⼯作流程操作:命令写⼊(append)、⽂件同步(sync)、⽂件重写(rewrite)、重启加载(load)。

AOF的工作流程如下:

  1. 所有的写⼊命令会追加到 aof_buf(缓冲区)中。
  2. AOF 缓冲区根据对应的策略向硬盘做同步操作。
  3. 随着 AOF ⽂件越来越⼤,需要定期对 AOF ⽂件进行重写,达到压缩的⽬的。
  4. 当 Redis 服务器启动时,可以加载 AOF 文件进行数据恢复。

(2)AOF缓冲区文件同步

AOF机制会把每命令的操作记录在缓冲区内,达到一定规则便会向磁盘中以文本形式写入命令,我们可以更改Redis配置文件中下面参数的选项以此来适应不同环境的需要。

Redis 提供了多种 AOF 缓冲区同步⽂件策略,由参数 appendfsync 控制,该参数的不同配置项如下:
可配置项说明
always
命令写⼊ aof_buf 后调⽤ fsync 同步,完成后返回
everysec
命令写⼊aof_buf 后只执⾏ write 操作,不进⾏fsync。每秒由同步线程进⾏ fsync。
no
命令写⼊ aof_buf 后只执⾏ write 操作,由 OS 控制fsync 频率。

系统调用write和fsync说明: 

  • write 操作会触发延迟写(delayed write)机制。Linux 在内核提供⻚缓冲区⽤来提供硬盘 IO 性能。write 操作在写⼊系统缓冲区后⽴即返回。同步硬盘操作依赖于系统调度机制,例如:缓冲区页空间写满或达到特定时间周期。同步⽂件之前,如果此时系统故障宕机,缓冲区内数据将丢失。
  • Fsync 针对单个⽂件操作,做强制硬盘同步,fsync 将阻塞直到数据写⼊到硬盘。
  • 配置为 always 时,每次写入都要同步 AOF ⽂件,性能很差,在⼀般的 SATA 硬盘上,只能⽀持⼤约⼏百 TPS 写⼊。除⾮是⾮常重要的数据,否则不建议配置。
  • 配置为 no 时,由于操作系统同步策略不可控,虽然提⾼了性能,但数据丢失⻛险⼤增,除⾮数据重要程度很低,⼀般不建议配置。
  • 配置为 everysec,是默认配置,也是推荐配置,兼顾了数据安全性和性能。理论上最多丢失 1 秒的数据。

(3)AOF重写机制

AOF文件内因为写入的是吗命令的文本文件,随着不断的写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。

为什么重写后的AOF体积可以变小,原因有以下几点:

  1. 进程内已超时的数据不再写⼊⽂件。
  2. 旧的 AOF 中的⽆效命令,例如 del、hdel、srem 等重写后将会删除,只需要保留数据的最终版本。
  3. 多条写操作合并为⼀条,例如 lpush list a、lpush list b、lpush list c可以合并为 lpush list a b c。
AOF 重写过程可以⼿动触发和⾃动触发:
  1. ⼿动触发:调⽤ bgrewriteaof 命令。
  2. ⾃动触发:根据 auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage 参数确定⾃动触发时机。
  • auto-aof-rewrite-min-size:表⽰触发重写时 AOF 的最⼩⽂件⼤⼩,默认为 64MB。
  • auto-aof-rewrite-percentage:代表当前 AOF 占⽤⼤⼩相⽐较上次重写时增加的⽐例。

 AOF重写流程图:

  1. . 执⾏ AOF 重写请求。如果当前进程正在执⾏ AOF 重写,请求不执⾏。如果当前进程正在执⾏ bgsave 操作,重写命令延迟到 bgsave 完成之后再执⾏。
  2. ⽗进程执⾏ fork 创建⼦进程。
  3. 重写:(1)主进程 fork 之后,继续响应其他命令。所有修改操作写⼊ AOF 缓冲区并根据 appendfsync 策略同步到硬盘,保证旧 AOF ⽂件机制正确。(2)⼦进程只有 fork 之前的所有内存信息,⽗进程中需要将 fork 之后这段时间的修改操作写⼊AOF 重写缓冲区中。
  4. ⼦进程根据内存快照,将命令合并到新的 AOF ⽂件中。
  5. ⼦进程完成重写: (1)新⽂件写⼊后,⼦进程发送信号给⽗进程。 (2)⽗进程把 AOF重写缓冲区内临时保存的命令追加到新 AOF ⽂件中。(3)⽤新 AOF ⽂件替换⽼ AOF ⽂件。

(4)Redis启动时数据恢复流程图

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

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

相关文章

【隐私计算篇】利用多方安全计算MPC实现VGG16人脸识别隐私推理

1. 背景介绍 本文主要介绍一种利用多方安全计算MPC技术,实现VGG16的人脸识别模型,侧重于模型推理阶段,目前已经公开专利,因此以下内容的分享都是基于公开材料。该分享涉及到最小化多方安全计算(MPC)以及明密文混合计算的思想&…

签署《AI安全国际对话威尼斯共识》 智源持续推动人工智能安全发展

近日,由AI安全国际论坛(Safe AI Forum)和博古睿研究院(Berggruen Institute) 共同举办的第三届国际AI安全对话(International Dialogues on AI Safety)在威尼斯举办。图灵奖得主Yoshua Bengio、姚期智教授&…

UBUNTU20.04安装CH384串口卡驱动

继续上文:统信UOS安装CH384串口卡驱动-CSDN博客 统信UOS系统成功安装CH384串口驱动后,继续在ubuntu20.04下安装驱动,发现一直报错,原因是内核驱动不一致。 解决办法: 1. 下载最新的驱动。CH35XCH384驱动源文件资源-C…

Java语言程序设计基础篇_编程练习题**18.30 (找出单词)

题目:**18.30 (找出单词) 编写一个程序,递归地找出某个目录下的所有文件中某个单词出现的次数。从命令行如下传递参数: java Exercise18_30 dirName word 习题思路 (读取路径方法)和18.28题差不多,把找…

Structure-Aware Transformer for Graph Representation Learning

Structure-Aware Transformer for Graph Representation Learning(ICML22) 摘要 Transformer 架构最近在图表示学习中受到越来越多的关注,因为它通过避免严格的结构归纳偏差而仅通过位置编码对图结构进行编码,自然地克服了图神经…

分享课程:VUE数据可视化教程

在当今这个数据驱动的世界中,数据可视化已经成为了一种至关重要的工具,它帮助我们理解复杂的数据集,发现模式、趋势和异常。数据可视化不仅仅是将数字转换成图表,它是一种将数据转化为洞察力的艺术。 1.什么是数据可视化&#xf…

C语言指针系列1——初识指针

祛魅:其实指针这块儿并不难,有人说难只是因为基础到进阶没有处理好,大家要好好跟着一步一步学习,今天我们先来认识一下指针 指针定义:指针就是内存地址,指针变量是用来存放内存地址的变量,在同一…

Java.动态代理

1.创建一个接口 package Mydynamicproxy1;public interface Star {public abstract String sing(String str);public abstract void dance(String str); }2.创建一个BigStar类,要实现Star这个接口 package Mydynamicproxy1;public class BigStar implements Star{…

webpack4 target:“electron-renderer“ 打包加速配置

背景 昨天写得一篇Electron-vue asar 局部打包优化处理方案——绕开每次npm run build 超级慢的打包问题-CSDN博客文章浏览阅读754次,点赞19次,收藏11次。因为组员对于 Electron 打包过程存在比较迷糊的状态,且自己也没主动探索 Electron-vu…

tcp、udp通信调试工具Socket Tool

tcp、udp通信调试工具Socket Tool ]

线程池的执行流程和配置参数总结

一、线程池的执行流程总结 提交线程任务;如果线程池中存在空闲线程,则分配一个空闲线程给任务,执行线程任务;线程池中不存在空闲线程,则线程池会判断当前线程数是否超过核心线程数(corePoolSize&#xff09…

LeaferJS 动画、状态、过渡、游戏框架

LeaferJS 现阶段依然专注于绘图、交互和图形编辑场景。我们引入游戏场景,只是希望让 LeaferJS 被更多有需要的人看到,以充分发挥它的价值 LeaferJS 为你带来了全新的游戏、动画、状态和过渡功能,助你实现那些年少时的游戏梦想。我们引入了丰富…

【后端开发】JavaEE初阶——计算机是如何工作的???

前言: 🌟🌟本期讲解计算机工作原理,希望能帮到屏幕前的你。 🌈上期博客在这里:【MySQL】MySQL中JDBC编程——MySQL驱动包安装——(超详解) 🌈感兴趣的小伙伴看一看小编主…

Dependency Check:一款针对应用程序依赖组件的安全检测工具

关于Dependency Check Dependency-Check 是一款软件组合分析 (SCA) 工具,可尝试检测项目依赖项中包含的公开披露的漏洞。它通过确定给定依赖项是否存在通用平台枚举 (CPE) 标识符来实现此目的。如果找到,它…

Java线程的三大特性

原子性: 线程任务不可再分。 int i 1; i; 原子类 AtomicXXX 可见性: 线程之间的操作是互相不可见的。 volatile //线程A如果,flag为true,就运行打印语句 A: trueThread t1 new Thread(() -> {while (true) {if (flag) {System.out.println(&q…

【数据结构】AVL树相关知识详细梳理

1. AVL树的概念 AVL的全称是Adelson-Velsky-Landis,其名称来源于其发明者Adelson、Velsky和Landis, 是平衡二叉树搜索树。 它的出现是由于二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找…

【数据结构】栈和队列(Stack Queue)

引言 在对顺序表,链表有了充分的理解之后,现在让我们学习栈和队列!!! 【链表】 👈链表 【顺序表】👈顺序表 目录 💯栈 1.栈的概念及结构 2.栈的实现 ⭐初始化栈 ⭐入栈 ⭐…

Vue引入js脚本问题记录(附解决办法)

目录 一、需求 二、import引入问题记录 三、解决方式 一、需求 我想在我的Vue项目中引入jquery.js和bootstrap.js这种脚本文件,但发现不能单纯的import引入,问题如下。 二、import引入问题记录 我直接这么引入,发现控制台报错TypeError: …

POI操作EXCEL增加下拉框

文章目录 POI操作EXCEL增加下拉框 POI操作EXCEL增加下拉框 有时候通过excel将数据批量导入到系统,而业务操作人员对于一些列不想手动输入,而是采用下拉框的方式来进行选择 采用隐藏sheet页的方式来进行操作 String sheetName "supplier_hidden_s…

MedPrompt:基于提示工程的医学诊断准确率优化方法

Medprompt:基于提示工程的医学诊断准确率优化方法 秒懂大纲解法拆解MedPrompt 提示词全流程分析总结创意视角 论文:Can Generalist Foundation Models Outcompete Special-Purpose Tuning? Case Study in Medicine 秒懂大纲 ├── 1 研究背景【描述背…