了解Redis数据持久化(上)

news2024/9/24 15:16:23

        Redis常用作缓存,提高读取相应性能。Redis如果宕机可以从后端数据库里恢复数据,但是会出现的问题:

  1. 数据是从慢速数据库里获取数据,速度比不上从Redis缓存中获取。
  2. 频繁访问数据库会给数据库造成压力。

        处理宕机的方法就是,将数据持久化。

1.Redis怎么进行数据持久化?

        Redis持久化有两种方法:

  • RDB 快照(snapshot) - 将存在于某一时刻的所有数据都写入到硬盘中。(内存快照,设定定时间内落盘)
  • 只追加文件(append-only file,AOF日志 )- 它会在执行写命令时,将被执行的写命令复制到硬盘中。写后日志的方式记录(先执行命令,然后将数据写入内存,然后记录日志)

2.宕机了,Redis 如何避免数据丢失?

        AOF通过追加的方式记录命令,避免数据丢失。但是当数据需要恢复的时候,需要逐一的执行命令,如果数据量过大的话,执行的时间就会过长,Redis恢复数据的过程缓慢,就会影响到正常的使用。AOF记录的是命令不是真实的数据。

        RDB记录的是某一个时刻的数据,在Redis恢复数据的时候只需要将数据写入内存,就能恢复数据了。

3.RDB 内存快照,让宕机快速恢复

3.1RDB的说明

        RDB其实就是Redis DataBase的缩写,所谓内存快照就是Redis内存中某一个时刻的数据状态。Redis将某一刻的数据拍下来,以文件的形式写入磁盘中。就像是拍照,记录下某一时刻的瞬间画面完全记录下来。Redis在进行写操作的时候,内存数据是一直在变化的。

3.2RDB给那些数据做快照?

        RDB给那些数据做快照?Redis的数据都在内存中,为了提供所有数据的可靠性保证,它执行的是全量快照,也就是说,把内存中的所有数据都记录到磁盘中,这就类似于给100个人拍合影,把每一个人都拍进照片里。这样做的好处是,一次性记录了所有数据,一个都不少。

        当你给一个人拍照时,只用协调一个人就够了,但是,拍100人的大合影,却需要协调100个人的位置、状态,等等,这当然会更费时费力。同样,给内存的全量数据做快照,把它们全部写入磁盘也会花费很多时间。而且,全量数据越多,RDB文件就越大,往磁盘上写数据的时间开销就越大。

        Redis 当作缓存使用,所以即使 Redis 没有保存全部数据,还可以通过数据库获取,所以 Redis 不会保存所有的数据, Redis 的数据持久化使用了「RDB 数据快照」的方式来实现宕机快速恢复。

        Redis通过定时RDB内存快照,不必每次都执行【写】指令写入磁盘,只需要在内存快照的时候写入磁盘,既保持了速度快,又对数据进行了持久化,宕机也能快速的恢复数据。

        直接将RDB数据读入内存,进行数据恢复。

图1 内存快照 

3.3生成 RDB 策略

        对于Redis而言,它的单线程模型就决定了,我们要尽量避免所有会阻塞主线程的操作。Redis生成RDB两方式:

  • save:主线程执行,会被阻塞。
  • bgsave:创建一个子进程,专门用于写入RDB文件,避免了主线程的阻塞,这也是Redis生成RDB的默认设置。调用glibc的函数fork产生一个子进程用于写入RDB文件,快照持久化完全交给子进程处理,父进程继续处理客户端请求,生产RDB默认配置文件。bgsave 子进程可以共享主线程的所有内存数据,读取主线程的数据并写入到 RDB 文件。

        共同:当进行save或者bgsave创建一个新的RDB文件时,程序会对数据库进行检查,已经过期的键不会被写入RDB中。

3.4在进行快照的时候数据可以被修改吗?

        Redis在进行RDB的时候,虽然主线程没有阻塞,为了保持数据的一致性,在进行RDB的时候只能进行读操作,不能进行写操作,不能修改正在执行快照的数据。

        举个例子。我们在时刻t给内存做快照,假设内存数据量是4GB,磁盘的写入带宽是0.2GB/s,简单来说,至少需要20s (4/0.2=20)才能做完。如果在时刻t+5s时,一个还没有被写入磁盘的内存数据A,被修改成了A’,那么就会破坏快照的完整性,因为A’不是时刻t时的状态。因此,和拍照类似,我们在做快照时也不希望数据“动”,也就是不能被修改。

        但是,如果快照执行期间数据不能被修改,是会有潜在问题的。对于刚刚的例子来说,在做快照的20s时间里,如果这4GB的数据都不能被修改,Redis就不能处理对这些数据的写操作,那无疑就会给业务服务造成巨大的影响。

        RDB 文件生成期间能处理写操作不是一回事

        你可能会想到,可以用bgsave避免阻塞啊。这里我就要说到一个常见的误区了,避免阻塞和正常处理写操作并不是一回事。此时,主线程的确没有阻塞,可以正常接收请求,但是,为了保证快照完整性,它只能处理读操作,因为不能修改正在执行快照的数据。

        解决写问题

        Redis使用操作系统的多进程写时复制技术 (COW/ copy on write )来实现快照持久化。

  • 子进程刚刚产生时,子进程跟父进程共享内存里的所有代码段和数据段。(这是Linux内存机制,为了节省内存资源,更快的共享起来,在进程分离一瞬间,内存增长基本没有变化。)
  • 在进行快照的时候,同时进行写操作
  • 简单来说,bgsave子进程是由主线程fork生成的,可以共享主线程的所有内存数据。bgsave子进程运行后,开始读取主线程的内存数据,并把它们写入RDB文件。

        当主线程执行写指令修改数据的时候,这个数据就会复制一份副本, bgsave 子进程读取这个副本数据写到 RDB 文件,所以主线程就可以直接修改原来的数据。这样保证了快照的完整性,也允许主线程同时进行写操作,避免对正常业务的影响。

        到这里,我们就解决了对“哪些数据做快照”以及“做快照时数据能否修改”这两大问题:Redis会使用bgsave对、当前内存中的所有数据做快照,这个操作是子进程在后台完成的,这就允许主线程同时可以修改数据。

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

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

相关文章

Go 调用Rust函数

Go 调用Rust函数 在golang 中,go可以引用c代码,和c共舞,也就是cgo.在一些包里就能看到cgo的身影,gopcap(引用了libpcap),go-sqlite(引用了libsqlite).毕竟c是"万物之主"嘛.本文利用cgo实现go调rust函数 这是一个rust demo用于生成…

【Docker】Docker学习03 | Docker的volume

本文首发于 ❄️慕雪的寒舍 1. 引入 在docker的基本知识讲解中,提到了docker镜像是由一层一层文件系统构成的。这一系列文件系统是一系列的只读层。当我们创建一个容器的时候,Docker会读取镜像(只读),并在镜像的顶部再…

SpringBoot集成google登陆快速入门Demo

1.为何要使用 Google 账号登录 借助“使用 Google 账号登录”功能,您可通过安全性备受信赖的 Google 账号,轻松快捷地在网上登录和注册网站与应用。该功能可消除您对密码的依赖,从而降低使用密码带来的困扰和安全风险。 2.环境准备 登录 G…

【IEEE出版】第八届电气、机械与计算机工程国际学术会议(ICEMCE 2024,10月25-27)

由西京学院主办,AEIC学术交流中心协办,中国科学技术大学、深圳大学、浙江工业大学等校联合支持的第八届电气、机械与计算机工程国际学术会议(ICEMCE 2024)将于2024年10月25日至27日在西安举办。 本次会议主要围绕“电气”、"…

【文档】软件项目售后服务标准文档参考(word原件)

软件售后服务方案的售后服务范围广泛,涵盖了多个方面,以确保客户在使用软件过程中得到全面、及时的支持。具体来说,这些服务范围通常包括以下几个核心内容: 技术支持服务维护与更新服务培训与教育服务定制化服务数据管理与服务客户…

[C语言]一、C语言基础(函数)

G:\Cpp\C语言精讲 6. 函数 6.1函数的基本使用 6.1.1 为什么需要函数 《街霸》游戏中,每次人物出拳、出脚或跳跃等动作都需要编写50-80行的代码,在每次出拳、出脚或跳跃的地方都需要重复地编写这50-80行代码,这样程序会变得很臃肿&#xff…

[学习笔记]深度学习详解-Datawhale学习组

第三章:深度学习基础 3.1 局部极小值与鞍点 3.1.1 临界点及其种类 优化神经网络时,使用梯度下降法,遇到梯度为0的点,训练就停了下来,损失也不再下降。 这个梯度为0的点,可以称为临界点。 临界点可以细分…

在挫折感中遇见更好的自己

你是如何克服编程学习中的挫折感的? 编程学习之路上,挫折感就像一道道难以逾越的高墙,让许多人望而却步。然而,真正的编程高手都曾在这条路上跌倒过、迷茫过,却最终找到了突破的方法。你是如何在Bug的迷宫中找到出口的…

ssrf+redisssrf+fastcgi

curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDA ssrfredis dict被禁用了用(?urlhttp://172.19.0.3端口)来探测一下端口吧 172.19.0.3主机只开放一个80端口 看看内网还有其他服务器没 这里可以看到内网还有…

Ai+若依(代码生成 -- 树表“有层级关系的”):【03篇】

代码生成 代码生成器,根据数据库表结构自动生成前后端CRUD代码提供三种生成模板:单表、树表、主子表(一对多)现在来说说树表,主子表 树表: 例如:公司==》部门==》员工 层级关系的这种 主子表: 例如: 数据之间存在一对多,比如菜品和口味表 一个菜品可以多个口味 自动化…

图形几何算法 -- 判断两条线段是否相交

线段相交检测是计算几何中的一个基本问题,广泛应用于计算机图形学、游戏开发、物理模拟等领域。我们可以通过以下步骤和理论来判断两条线段是否相交。 概念 在二维平面上,给定两条线段 A(P1, P2) 和 B(Q1, Q2),我们需要判断这两条线段是否相…

鸿蒙内核源码分析(双向链表) | 谁是内核最重要结构体?

答案一定是: LOS_DL_LIST(双向链表)&#xff0c;它长这样. typedef struct LOS_DL_LIST {//双向链表&#xff0c;内核最重要结构体struct LOS_DL_LIST *pstPrev; /**< Current nodes pointer to the previous node *///前驱节点(左手)struct LOS_DL_LIST *pstNext; /**<…

Linux-部署YUM仓库及NFS共享服务

系列文章目录 提示&#xff1a;仅用于个人学习&#xff0c;进行查漏补缺使用。 1.Linux-网络设置 2.Linux-DHCP服务、vsftp 3.Linux-DNS域名解析服务 4.Linux-远程访问及控制 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档…

【GIS系列】多源异构原始影像解析:策略模式与规则引擎的应用

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 1. 前言 在遥感技术和地球观测领域&#…

机器学习周报(8.19-8.25

文章目录 摘要Abstract1.PyTorch环境的配置及安装使用PyCharm配置环境安装配置jupyter 2.两个Python常用函数3.DataSet4.TensorBoard的使用绘制一幅坐标图使用tendorboard对一幅图片进行操作 5.torchvison中的transforms总结 摘要 在之前学习了一些机器学习相关理论之后&#…

【限时免费发放】2000+热门Scratch作品源码

欢迎访问小虎鲸Scratch资源站&#xff01;在Scratch编程的学习过程中&#xff0c;优质的资源和灵感是至关重要的。因此&#xff0c;我们特别准备了这份【免费下载】的Scratch作品源码合集&#xff0c;包含超过2000个精选的Scratch项目源码&#xff0c;旨在为Scratch编程爱好者和…

Nginx+keepalived实现高可用

目录 一、准备工作 1、安装软件 二、配置master主服务器 1、修改nginx主配置文件 ​编辑 2、修改keepalived主配置文件 三、配置backup备服务器 四、配置节点服务器 1、配置第一个节点服务器 1.1、设置虚拟网卡 1.2、忽略ARP请求 1.3、安装并启动nginx软件 2、配置…

【STM32】SPI接口(非连续传输)

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 前言 SPI简介 IO口初始化 SPI配置 时钟使能 SPI初始化 SPI使能 数据接收与发送 硬件SPI代码 MySPI.h MySPI.c 前言 【通信协议】SPI总线-CSDN博客 本篇博客学习使用STM32的…

Expo 开发ReactNative 后切换 eas 账号

修改slug app.json中的sulg字段更新为新账号应用sulg 修改projectId app.json中的extra.eas.projectId字段更新为新账号应用projectId 退出账号&#xff1a; eas logout 重新登录&#xff1a; eas login

基于WEB的学生综合测评系统的设计与实现

第1章 绪 论 1.1 系统开发背景 随着计算机技术的不断发展,在现代化社会中,信息的处理越来越依赖计算机来完成。在没有测评系统之前&#xff0c;所有的信息记录都是由人工记录维护&#xff0c;不但不方便&#xff0c;还经常出错&#xff0c;有了测评系统就可以方便的对各种信息…