Redis学习[3] ——持久化

四. Redis 持久化

4.1 Redis 如何保证数据不丢失?

由于Redis的数据是保存在内存中,而内存中的数据会在Redis重启后丢失。因此,为了保证数据不丢失,Redis实现了数据持久化的机制。这个机制会将内存中的数据存储到磁盘,重启后可以从磁盘中恢复。

Redis共有三种数据持久化的方式:

  • AOF日志:每执行一条写操作命令,就把该命令以追加的方式写到一个文件里;
  • RDB快照:将某一时刻的内存数据,以二进制的方式写入磁盘;
  • 混合持久化方式:Redis 4.0新增,集成了AOF和RBD的优点。

4.2 AOF 日志是如何实现的?

4.2.1 AOF 日志写入

Redis在执行完一条写操作命令后,就会把该命令以追加写的方式写到一个文件中。当Redis重启后,会读取该文件记录的命令,逐个执行来恢复数据。

请添加图片描述

为什么是先执行命令,然后再把命令写入日志?

Reids 是先执行写操作命令后,才将该命令记录到 AOF 日志里的,这么做其实有两个好处:

  • 避免额外的检查开销:如果先写入再执行,那在写入的时候还无法确定是否能够执行。需要增加一步检查命令。
  • 不会阻塞当前写操作命令的执行:因为是完成写操作再去写入之日。

也会存在风险:

  • 数据可能会丢失:如果完成了写操作但还没来得及写入日志,服务器宕机了,会丢失这个数据;
  • 可能阻塞其他操作:AOF日志也是在主线程中执行的,会阻塞后续的操作等待写入完成;
4.2.2 AOF 日志写回策略

Redis写入AOF日志的过程可以由下图所示:

  1. Redis执行完写操作命令后,会将命令追加到一个缓冲区;
  2. 然后通过write()系统调用,将该缓冲区的命令写入到磁盘中的AOF文件中。实际上这一步只会让命令拷贝到了AOF文件的内核缓冲区,什么时候写入到硬盘由内核决定

Redis提供了3种写回硬盘的策略,控制什么时候将数据写入硬盘

  • Always:每次写操作执行完成后,直接将AOF日志数据写回硬盘;
  • Everysec:写操作执行完成后,数据会先存放在AOF文件的内核缓冲区,每隔一秒将缓冲区的内容写回到磁盘。
  • No:Redis不控制写回的执行,完全交给操作系统来控制

在这里插入图片描述

4.2.3 AOF 重写机制

随着执行的写操作越来越多,AOF日志文件会越来越大,在数据恢复时会越慢,影响性能。因此,Redis提供了重写机制,来避免AOF日志文件越写越大

AOF重写机制是根据K-V数据中的键值对,将每个键值对形成一个命令,记录到「新的 AOF 文件」中,完成后用这个「新的 AOF 文件」替换掉原有的AOF文件。

在这里插入图片描述

AOF重写机制的本质就是**只保留最新的在使用重写机制后,就会读取 name 最新的 value(键值对) ,然后用一条 「set name xiaolincoding」命令记录到新的 AOF 文件,之前的第一个命令就没有必要记录了,因为它属于「历史」命令,没有作用了。这样一来,一个键值对在重写日志中只用一条命令就行了**。

AOF重写是怎么完成的?

Redis是在每次需要AOF重写时,通过**新开辟一个子进程bgrewriteaof来完成AOF重写 **。这是由于:

  • 不会阻塞主进程,主进程可以继续处理命令请求;
  • 如果是多线程,由于共享数据,需要通过锁机制来保证数据安全,会影响性能。而子进程是拷贝数据的副本,创建子进程时,父子进程是共享内存数据的,不过这个共享的内存只能以只读的方式,而当父子进程任意一方修改了该共享内存,就会发生**「写时复制」,于是父子进程就有了独立的数据副本**,就不用加锁来保证数据安全

数据不一致问题?

因为在重写过程中,主进程仍然可以正常处理命令。如果发生了对已有key-value的修改,由于**「写时复制」子进程中关于这个key-value和主进程中的数据出现了不一致。为了解决这个问题,Redis设置了一个AOF重写缓冲区**。

在重写AOF期间,主进程对于所有的写操作命令除了将其加入到**「AOF 缓冲区」,还会加入到「AOF重写缓冲区」。当子进程完成重写时,会向主进程发送一个信号**(进程间的通信方式),主进程收到信号时会执行:

  • 将**「AOF重写缓冲区」中的所有内容追加到「新的 AOF 文件」**中;
  • 用**「新的 AOF 文件」**覆盖掉「旧的 AOF 文件」

截止到此,就完成了整个AOF重写的工作。

4.3 RDB 快照是如何实现的?

Redis使用AOF进行恢复时,如果AOF日志较多,需要逐个执行,势必会使Redis的恢复缓慢。为了解决这个问题,Redis增加了RDB快照。

RDB快照就是记录某一个瞬间的内存数据(是数据而不是命令),由于是直接记录的数据,因此在恢复时不需要执行操作命令,只需要将RDB文件读入内存即可,效率很高

4.3.1 RDB快照生成方法

Redis提供了两个命令来生成RDB快照:savebgsave,它们的区别在于生成快照是否在「主进程」里执行

  • save命令:在主进程中生成RDB快照,如果写入时间太长,会导致主线程阻塞,影响性能;
  • bgsave命令:会创建一个**子进程来生成RDB快照**,避免主线程的阻塞。

Redis 的快照是全量快照,也就是说每次执行快照,都是把内存中的**「所有数据」都记录到磁盘中。所以执行快照是一个比较重的操作,如果频率太频繁,可能会对 Redis 性能产生影响。如果频率太低,服务器故障时,丢失的数据会更多。**

4.3.2 RDB快照如何保证数据一致性?

如果是使用bgsave命令来执行生成快照,此时主进程仍然可以继续处理操作,但是由于快照是在一瞬间的数据,所以不需要去关注是否数据发生了变化。因此,RDB快照不存在数据一致性问题

如果主线程执行写操作,则被修改的数据会复制一份副本,然后 bgsave 子进程会**把原来副本数据写入 RDB 文件(不去管新的),在这个过程中,主线程仍然可以直接修改原来的数据。因此,借助写时复制技术(Copy-On-Write, COW)**,RDB不用关注数据一致性问题。

4.3 为什么会有混合持久化?

😊 RDB 优点是数据恢复速度快,但是快照的频率不好把握。频率太低,丢失的数据就会比较多,频率太高,就会影响性能。

😊 AOF 优点是丢失数据少,但是数据恢复不快。

为了集成了两者的优点, Redis 4.0 提出了混合使用 AOF 日志和RDB快照,也叫混合持久化,既保证了 Redis 重启速度,又降低数据丢失风险。

混合持久化是如何实现的?

  • 使用了混合持久化,AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据

    当开启了混合持久化,在AOF重写日志时,重写子进程就不是把数据转换成命令写入了,而是**直接生成当时数据库的RDB快照并写入到AOF文件中。然后,主进程中记录在AOF重写缓冲区的命令继续以AOF日志的格式写入到AOF日志文件中**,替换旧的的 AOF 文件。

在这里插入图片描述

混合持久化优点:

  • 混合持久化结合了 RDB 和 AOF 持久化的优点,开头为 RDB 的格式,使得 Redis 可以更快的启动,同时结合 AOF 的优点,有减低了大量数据丢失的风险

混合持久化缺点:

  • AOF 文件中添加了 RDB 格式的内容,使得 AOF 文件的可读性变得很差
  • 兼容性差,如果开启混合持久化,那么此混合持久化 AOF 文件,就不能用在 Redis 4.0 之前版本了

资料参考

内容大多参考自:图解Redis介绍 | 小林coding (xiaolincoding.com)

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

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

相关文章

【前端 · 面试 】JavaScript 之你不一定会的基础题(一)

最近我在做前端面试题总结系列,感兴趣的朋友可以添加关注,欢迎指正、交流。 争取每个知识点能够多总结一些,至少要做到在面试时,针对每个知识点都可以侃起来,不至于哑火。 JavaScript 之你不一定会的基础题 前言 面试往…

[LLM]一文学会如何构建属于私有Code Pilot

本文将使用基于Llama.cpp的插件Tabby构建个人Code Pilot助手。 首先我们看一下编码的大模型榜单,在抱抱脸上bigcode上可以参考。 给VSCode插上翅膀 榜单上排名第一的是OpenCodeInterpreter-DS-33B,看起来很强大但是显然 MAC M1 是跑不了。虽然 MAC M1可…

使用人工智能在乳腺癌筛查中的早期影响指标| 文献速递-AI辅助的放射影像疾病诊断

Title 题目 Early Indicators of the Impact of Using AI in Mammography Screening for Breast Cancer 使用人工智能在乳腺癌筛查中的早期影响指标 01 文献速递介绍 基于人群的乳腺癌筛查通过使用乳房X线摄影成功地降低了乳腺癌的死亡率,但这给乳腺放射科医生…

react中路由懒加载

// 1.引入方法,用于创建路由实例 // createBrowserRouter是用于创建history模式 // createHashRouter是用于创建hash模式 // 路由模式的切换只需要更改创建路由实例的方法就行了,其他地方不需要更改 import { createBrowserRouter,createHashRouter } fr…

Navicat For Mysql连接Mysql8.0报错:客户端不支持服务器请求的身份验证协议

windows通过navicat连接本地mysql时报错:Client does not support authentication protocol requested by server; consider upgrading MySQL client 一、问题原因二、解决方法1--失败1. 连接mysql客户端2. 修改加密方式3.正确的解决方法1.查找my.ini文件2.修改my.ini文件3.重…

[C#]基于wpf实现的一百多种音色的Midi键盘软件

键盘 音色库 源码地址:https://download.csdn.net/download/FL1623863129/89599322

NLP与搜广推常见面试问题

1 auc指标 AUC的两种意义 一个是ROC曲线的面积另外一个是统计意义。从统计学角度理解,AUC等于随机挑选一个正样本和负样本时,模型对正样本的预测分数大于负样本的预测分数的概率。下图为搜广推场景下的一个计算auc的例子

开启mybatis-plus日志功能

第一部分:配置文件增添参数 增加如下: configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 第二部分:运行效果展示

[数据集][目标检测]金属罐缺陷检测数据集VOC+YOLO格式8095张4类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):8095 标注数量(xml文件个数):8095 标注数量(txt文件个数):8095 标注…

Snowflake 集成模式:Apache Kafka 与零 ETL 和反向 ETL

Snowflake 是领先的云原生数据仓库。集成模式包括批量数据集成、零 ETL 和使用 Apache Kafka 的近乎实时的数据摄取。这篇博文探讨了不同的方法,并发现了它们的利弊。根据行业建议,建议避免使用反向 ETL 等反模式,而是使用数据流来增强企业架…

Vue Router 进阶

Vue Router 通过跳转或取消的方式守卫导航,可以在导航解析的不同节点来控制路由的跳转与取消。定义路由时,可以配置元信息。可以定制页面跳转的过度效果。还可以在程序已经运行的时候添加和删除路由。 1 Router进阶 1.1 导航守卫 守卫,是指…

高品质定制线缆知名智造品牌推荐-精工电联:高压线缆行业定制服务的领航者

定制线缆源头厂家推荐-精工电联:高压线缆行业定制服务的领航者 在当今这个高度信息化的社会,电力传输与分配系统的稳定运行至关重要。作为连接各个电力设备的纽带,高压线缆的质量直接关系到电力系统的安全性和稳定性。在定制高压线缆行业中&a…

Apache DolphinScheduler用户线上Meetup火热来袭!

Apache DolphinScheduler 社区 8 月用户交流会精彩继续!本次活动邀请到老牌农牧产品实业集团铁骑力士架构工程师,来分享Apache DolphinScheduler在现代农牧食品加工场景中的应用实践。此外,还将有社区活跃贡献者以Apache DolphinScheduler为例…

C语言进阶 13. 文件

C语言进阶 13. 文件 文章目录 C语言进阶 13. 文件13.1. 格式化输入输出13.2. 文件输入输出13.3. 二进制文件13.4. 按位运算13.5. 移位运算13.6. 位运算例子13.7. 位段 13.1. 格式化输入输出 格式化输入输出: printf %[flags][width][.prec][hlL]type scanf %[flags]type %[fl…

Spring Boot:SpringBoot入门

本文是跟着B站"黑马程序员"up主的SpringBoot3vue3的视频的学习过程记录,仅用于学习记录 视频里的图: 呃。。。。都没有学过这些。。。。。 不管了,先学。。。。。。入门: 创建Maven工程 导入spring-boot-stater-web起…

AI测试:人工智能模型的核心测试指标,分类判别、目标检测、图像分割、定量计算分别有哪些指标?

在前面的人工智能测试技术系列文章中,我们详细介绍了人工智能测试的技术方法和实践流程。在了解人工智能测试方法后,我们需要进一步学习和研究如何衡量这些方法的有效性,即人工智能模型测试指标的选择。测试指标的选择主要取决于模型的类型和…

MySQL基础练习题15-进店却未进行交易过的顾客

题目:有一些顾客可能光顾了购物中心但没有进行交易。来查找这些顾客的 ID ,以及他们只光顾不交易的次数。 准备数据 分析数据 题目:有一些顾客可能光顾了购物中心但没有进行交易。来查找这些顾客的 ID ,以及他们只光顾不交易的次…

介绍五款广受好评的企业级加密软件

在当今信息化时代,数据安全已成为企业管理的重要环节。随着网络攻击和数据泄露事件的频繁发生,如何有效保护企业数据不被泄露,成为各大企业关注的焦点。加密软件作为一种有效的防护工具,通过对数据进行加密处理,确保敏…

最好用的复制粘贴软件pastemate功能简介

这应当是windows下最好用的复制粘贴软件,遥遥领先的复制粘贴软件。 效增PasteMate - 下载页面 windows下界面最优美,操作最方便的复制粘贴神器,学生党论文必备,效率神器 pastemate 1.搜索功能,能够按文本、图片、文件…

AI多模态模型架构之输出映射器:Output Projector

〔探索AI的无限可能,微信关注“AIGCmagic”公众号,让AIGC科技点亮生活〕 本文作者:AIGCmagic社区 刘一手 前言 AI多模态大模型发展至今,每年都有非常优秀的工作产出,按照当前模型设计思路,多模态大模型的…