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

news2024/12/25 12:24:36

目录

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.coloradmin.cn/o/2168648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于nodejs+vue的农产品销售管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…

AIGAME的核心技术竞争力与未来生态规划

AIGAME凭借其领先的区块链和人工智能技术,打造了全球首个融合链游、DeFi和加密聊天的Web3娱乐平台。平台的核心技术创新和多元化生态规划,将推动全球虚拟资产管理和娱乐行业的变革。 AIGAME的核心技术竞争力源于其对区块链和人工智能(AI&…

你知道吗?制造手机芯片的关键竟然是一台“打印机”?

在我们每天离不开的智能手机里,藏着一颗小小的“心脏”——芯片。它虽小,却拥有着强大的计算能力,能够让我们随时随地与世界保持连接。你可能想象不到,制造这些精密芯片的关键设备,竟然与我们日常使用的打印机有着惊人…

Jmeter实战——编写博客标签模块增删改查自动化脚本和压测

一、自动化脚本架构搭建 1、添加setUp线程组,测试标签新增功能;添加tearDown线程组,测试标签删除功能 这里可以将标签的增删改查写到一个线程组,但是为了实践setUp和tearDown线程组的使用,将它们写到不同线程组中了。…

C/C++—有关日期类的OJ题

✨✨ 欢迎大家来到小伞的大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C学习 小伞的主页:xiaosan_blog 1.计算日期到天数的转换(简单) 计算日期到天数转换__牛客网 (nowcoder.com)​​…

Qt-QTreeWidget多元素控件(38)

目录 描述 QTreeWidget 方法 QTreeWidget 信号 QTreeWidgetItem 属性 QTreeWidgetItem 方法 控制 使用 界面操作 代码操作 总结 描述 使⽤ QTreeWidget 表⽰⼀个树形控件.⾥⾯的每个元素,都是⼀个 QTreeWidgetItem ,每个 QTreeWidgetItem 可以包含多个⽂本和图标,每…

电脑系统重装系统盘文件还能恢复吗?

当我们的电脑出现中病毒、系统文件受损、系统变慢、无法启动或蓝屏等情况,大部分朋友都会选择重装系统。但重装系统后原来保存在系统盘的文件都会被删除。遇到这种情况,我们还有方法可以恢复之前保存在系统盘的文件吗? 一、从备份中恢复数据 …

智能优化算法-人工鱼群优化算法(ASFA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 人工鱼群优化算法 (Artificial Fish Swarm Algorithm, AFSA) 是一种基于群体智能的元启发式优化算法,它模拟了鱼群的觅食、聚群和避障行为,用于解决复杂的优化问题。 AFSA的工作机制主要…

Xilinx的JESD204B PHY层IP仿真及上板测试(JESD204B四)

本文配置JESD204B PHY的参数,分析其示例工程,并且对该IP进行仿真,由于该IP只是物理层,并没有上层协议,因此与GTX/H其实没有太大区别。 1、配置IP 如下图所示,在IP Catalog中搜索JESD204B的PHY,…

国产RISC-V案例分享,基于全志T113-i异构多核平台!

RISC-V核心优势 全志T113-i是一款双核Cortex-A7@1.2GHz国产工业级处理器平台,并内置玄铁C906 RISC-V和HiFi4 DSP双副核心,可流畅运行Linux系统与Qt界面,并已适配OpenWRT系统、Docker容器技术。 而其中的RISC-V属于超高能效副核心,主频高达1008MHz,标配内存管理单元,可运…

python 魔法方法简记

简单记录python中的魔法方法 一、构造与析构 __init__(self[,...]) 需要初始化时可重写__init__方法 __new__(cls[,...]) 以类为参数,返回实例化对象 __del__(self) 前两个为构造器,此为析构器,用于销毁对象 二、算术运算 1、算术运算…

大文件想要传输成功,怎么把ZIP文件分卷压缩

不知道各位小伙伴有没有这样的烦恼,发送很大很大的压缩包会受到限制,为此,想要在压缩过程中将文件拆分为几个压缩包并且同时为所有压缩包设置加密应该如何设置? 方法一:使用7-Zip免费且强大的文件管理工具 7-Zip也是一…

MATLAB定位程序与讲解【专栏介绍】

AOA(到达角度)定位原理: 描述了基于到达角度进行定位的方法,适用于一维、二维或三维空间。 由动静压之比求马赫数的MATLAB函数: 提供了一个计算马赫数的函数,用于流体力学中速度的计算。 三边法定位与三点法…

【电子通识】案例:连接器接线顺序评估为什么新人总是评估不到位?

在一个IC卡切换的工装板(一切多)中,设计需求是一张PCB(充当活动卡片)插入读卡器,将卡片中的所有信号引出通过连接器连接到后级设备。 比如下图所示是一种IC卡压力测试设备,使用钢片卡片将压力信号通过连接器引入测试设备。 最后根据ISO/IEC 7816-2标准中我们看到…

hexo本地部署-图文教程

hexo本地部署-图文教程 最终效果前置条件安装使用配置主题创建页面标签页分类页友链页404页 个性化设置语言及网站信息设置导航栏,菜单目录头像及背景封面图美化特效 模板页的配置说明页面 Front-matter文章 Front-matter 最终效果 前置条件 你的电脑需要有git,node环境 安装使…

MySQL 中优化 COUNT()查询的实用指南

在 MySQL 数据库的使用中,我们经常会用到 COUNT()函数来统计行数或满足特定条件的行数。然而,在处理大规模数据时,COUNT()查询可能会变得非常缓慢,影响数据库的性能。那么,如何在 MySQL 中优化 COUNT()查询呢&#xff…

TRIZ理论在机器人性能优化中的应用

随着机器人应用场景的不断拓展,对机器人性能的要求也日益提高。如何在保证功能多样化的同时,提升机器人的性能稳定性、效率及智能化水平,成为了工程师和研发人员面临的重大挑战。TRIZ理论,即发明问题解决理论,以其系统…

Python和C++及MATLAB距离相关性生物医学样本统计量算法及数据科学

🎯要点 统计观测值之间距离计算代谢组学和脂质组学分析相关距离矩阵计算卡方检验偏差校正快速计算距离协方差算法大规模生物系统分析距离矩阵相关性测试石油勘探统计学关系 Python距离矩阵 在数学、计算机科学,尤其是图论中,距离矩阵是一…

02-Mybatis基础操作

1. Mybatis基础操作 1.1 需求 需求说明: 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发 通过分析以上的页面原型和需求,我们确定了功能列表: 查询 根据主键ID查询条件查询 新增更新删除 根…

FreeRTOS(四)FreeRTOS列表与列表项

目录 列表 列表项 迷你列表项 列表和列表项的关系 列表相关API函数 列表初始化 列表项初始化 列表项插入 列表项末尾插入 列表项删除 列表遍历 在 FreeRTOS 中,列表(List)和列表项(ListItem)是核心数据结构&…