redis持久化存储

news2024/10/6 18:26:50

Redis的持久化机制

Redis是一个基于内存的数据库,它的数据是存放在内存中,内存有个问题就是关闭服务或者断电会丢失。Redis的数据也支持写到硬盘中,这个过程就叫做持久化。

Redis提供如下两种持久化方式

RDB(Redis DataBase) :在指定的时间间隔内,定时的将 redis 存储的数据生成Snapshot快照并存储到磁盘等介质上;

AOF(Append Of File) :将 redis 执行过的所有写指令记录下来,在下次 redis 重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。

AOF+RDB : RDB 和 AOF 两种方式也可以同时使用,在这种情况下,如果 redis 重启的话,则会优先采用 AOF 方式来进行数据恢复,这是因为 AOF 方式的数据恢复完整度更高。

RDB持久化机制:

Redis Database Backup file(Redis数据备份文件),也被叫作Redis数据快照。简单的来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件(二进制文件),恢复数据。快照文件称为RDB文件。

我们知道 Redis 是单线程程序,这个线程要同时负责多个客户端套接字的并发读写操作和内存数据结构的逻辑读写。

在服务线上请求的同时,Redis 还需要进行内存快照,内存快照要求 Redis 必须进行文件 IO 操作,这意味着单线程同时在服务线上的请求还要进行文件 IO 操作,文件 IO 操作会严重拖垮服务器请求的性能。还有个重要的问题是为了不阻塞线上的业务,就需要边持久化边响应客户端请求。

SAVE的执行时机:

1.执行save命令:在执行持久化的过程同时去阻塞redis进程

2.执行bgsave命令:异步持久化,不会阻塞redis的使用(一般来说都是使用这个命令)

3.触发RDB条件时候

在 redis.conf 文件中会有相关的配置信息

save ,满足条件就将内存中的数据同步到硬盘中。

save 900 1

900秒内,如果至少有1个key被修改,则执行bgsave , 如果是save "" 则表示禁用RDB

实际操作

save:

可以通过redis服务端可以通过指定目录的形式读取该目录下的rdb文件

bgsave:

Redis 在持久化时会调用 glibc 的函数 fork 产生一个子进程,快照持久化完全交给子进程来处理,父进程继续处理客户端请求。子进程刚刚产生时,它和父进程共享内存里面的代码段和数据段。这时你可以将父子进程想像成一个连体婴儿,共享身体。这是 Linux 操作系统的机制,为了节约内存资源,所以尽可能让它们共享起来。在进程分离的一瞬间,内存的增长几乎没有明显变化。

如果当redis子线程持久化的数据正常被父线程再修改的时候怎么办?

在Redis中,当子线程(如bgsave子进程)进行持久化操作时,如果父线程(主进程)对数据进行了修改,Redis采用了一种称为COW(copy-on-write)的技术来处理这种情况。具体来说,当父线程尝试修改一块内存中的数据时,这块数据会被复制一份,生成一个数据副本。然后,子线程可以使用这个数据副本进行持久化操作,而不会影响到正在被修改的原始数据。

这种机制确保了即使在持久化过程中发生数据修改,子线程也能准确地将最新的数据状态写入到RDB文件中,从而保证数据的一致性和完整性。此外,由于COW技术涉及到的数据复制是临时的,它不会导致额外的性能开销,因为这些复制的数据最终会被原数据替换或删除

注意:

这里会有一个极端的情况,比如Redis内存大小是32个GB,在某一个时刻,这32GB的数据都被修改了,根据上面COW技术,那么就需要把当前数据在复制一份,需要内存大小为32G了,两个内存占用量就是64GB,所以,我们在给Redis分配内存空间的时候,需要注意,需要给Redis预留一些空间内存。

通过RDB文件恢复数据

将dump.rdb 文件拷贝到redis的安装目录的bin目录下,重启redis服务即可。在实际开发中,一般会考虑到物理机硬盘损坏情况,选择备份dump.rdb 。

RDB的优缺点

RDB 的优点

体积更小:相同的数据量 RDB 数据比 AOF 的小,因为 RDB 是紧凑型文件。

恢复更快:因为 RDB 是数据的快照,基本上就是数据的复制,不用重新读取再写入内存。

性能更高:父进程在保存 RDB 时候只需要fork一个子进程,无需父进程的进行其他io操作,也保证了服务器的性能。

RDB 的缺点

故障丢失:因为 RDB 是全量的,我们一般是使用shell脚本实现30分钟或者1小时或者每天对 Redis 进行 RDB 备份,(注,也可以是用自带的策略),但是最少也要5分钟进行一次的备份,所以当服务死掉后,最少也要丢失5分钟的数据。

耐久性差:相对 AOF 的异步策略来说,因为 RDB 的复制是全量的,即使是 fork 的子进程来进行备份,当数据量很大的时候对磁盘的消耗也是不可忽视的,尤其在访问量很高的时候,主线程 fork 的时间也会延长,导致 cpu 吃紧,耐久性相对较差。

AOF持久化机制

AOF持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到回复数据的目的。AOF的主要作用是解决了数据持久化的实时性。

开启方式:

开启AOF功能需要设置配置: appendonly yes,默认不开启。AOF文件名通过appendfilename配置设置,默认文件名是appendonly.aof。保存路径同RDB持久化方式一致,通过dir配置指定。

AOF写入策略

系统调用write和fsync说明:

Write操作会触发延迟写机制。Linux在内核提供页缓冲区用来提高硬盘IO性能。wirte操作在写入系统缓冲区后直接返回。同步硬盘操作依赖于系统调度机制。例如:缓冲区页空间写满或达到特定时间周期。同步文件之前,如果此时系统故障宕机,缓冲区内数据将丢失。

fync针对单个文件操作(比如AOF文件),做强制硬盘同步,fsync将阻塞进程直到写入硬盘完成后返回,保证了数据持久化。

AOF写入流程

AOF追加阻塞

当开启AOF持久化时,常用的同步硬盘的策略是everysec,用于平衡性能和数据安全性。对于这种方式,Redis使用另一条线程每秒执行fsync同步硬盘。当系统硬盘资源繁忙时,会造成Redis主线程阻塞

阻塞流程分析:

1)主线程负责写入AOF缓冲区

2)AOF线程负责每秒执行一次同步磁盘操作,并记录最近一次同步时间

3)主线程负责对比上次AOF同步时间

如果距上次同步成功时间在2秒内,主线程直接返回。

如果距上次同步成功时间超过2秒,主线程将会阻塞,直到同步操作完成

AOF重写

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

触发机制

手动触发:

直接调用 bgrewriteaof 命令

自动触发:

根据 auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage参数确定自动触发时机

auto-aof-rewrite-min-size 表示运行AOF重写时文件最小体积,默认为64MB

auto-aof-rewrite-percentage:代表当前AOF文件空间(aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的比值

自动触发时机=aof_current_size>auto-aof-rewrite-minsize&&(aof_current_size-aof_base_size)/aof_base_size>=auto-aof-rewritepercentage(其中aof_current_size和aof_base_size可以在info Persistence统计信息中查看)

AOF重写流程

1)执行AOF重写请求,如果当前进程正在执行AOF重写,请求不执行并返回如下响应:

ERR Background append only file rewriting already in progress

如果当前进程正在执行bgsave操作,重写命令延迟到bgsave完成之后再执行,返回如下响应:

Background append only file rewriting scheduled

2)父进程执行fork创建子进程,开销等同于bgsave过程

3)主进程fork操作完成后,继续响应其他命令。所有修改命令依然写

入AOF缓冲区并根据appendfsync策略同步到硬盘,保证原有AOF机制正确性

由于fork操作运用写时复制技术,子进程只能共享fork操作时的内

存数据。由于父进程依然响应命令,Redis使用“AOF重写缓冲区”保存这部

分新数据,防止新AOF文件生成期间丢失这部分数据

4)子进程根据内存快照,按照命令合并规则写入到新的AOF文件。每

次批量写入硬盘数据量由配置aof-rewrite-incremental-fsync控制,默认为

32MB,防止单次刷盘数据过多造成硬盘阻塞

5)新的AOF文件写入完成后,子进程发送信号给父进程,父进程更新

统计信息,具体见info persistence下的aof_*相关统计

父进程把AOF重写缓冲区的数据写入到新的AOF文件

使用新AOF文件替换老文件,完成AOF重写

当aof_buf和aof_rewrite_buf写满的时候是无法将进行一个持久化存储的操作的,所以我们在设置缓冲区大小时需要注意

AOF重写是基于我们当下这一刻内存中是有什么数据进行重写的,而不是根据命令log进行重写的。AOF重写时,看内存中有哪些数据,根据这些数据对应生成一个命令

AOF的优缺点分析

AOF 的优点

数据保证:我们可以设置fsync策略,一般默认是 Everysec,也可以设置每次写入追加,所以即使服务死掉了,也最多丢失一秒数据

自动缩小:当 AOF 文件大小到达一定程度的时候,后台会自动的去执行 AOF 重写,此过程不会影响主进程,重写完成后,新的写入将会写到新的 AOF 中,旧的就会被删除掉。但是此条如果拿出来对比 RDB 的话还是没有必要算成优点,只是官网显示成优点而已。

AOF 的缺点

性能相对较差:它的操作模式决定了它会对 Redis 的性能有所损耗。(主线程写文档)

体积相对更大:尽管是将 AOF 文件重写了,但是毕竟是操作过程和操作结果仍然有很大的差别,体积也毋庸置疑的更大。

恢复速度更慢:因为要重新加载每条命令的执行,恢复速度比较慢

RDB和AOF的比较:

RDB恢复数据的速度更快,当我们用redis作为DB的热点数据时,我们会同步的将一定权重的数据存储到DB中,即使我们服务器宕机宕掉之后,当我们重启后我们还是可以从DB中将数据加载到缓存中,这时候用RDB的方式进行恢复会更为合适。

当我redis的基本上的所有流量它基本上都是读的流量,写的流量比较少(小到一定的程度时),这种情况来说丢失的数据量会比较少,这时候我们用RDB进行持久化是比较合适的。

AOF的优点时就是数据的一致性比较好,当我们缓存的数据是DB中没有的时候,例如排行榜,数据只在redis中,当我丢失数据就会影响排行榜的排名,这时候我们就会使用AOF来进行一个持久化的工作。

现实生活中我们用的更多是AOF+RDB的一种方式:

 RDB 和 AOF 两种方式也可以同时使用,在这种情况下,如果 redis 重启的话,则会优先采用 AOF 方式来进行数据恢复,这是因为 AOF 方式的数据恢复完整度更高。方式恢复数据时会优先查找看有没有RDB文件,如果有的话,就用RDB进行恢复,恢复速度快.

redis中定期删除的一些策略:

定期删除:设置一个时间,每隔一定的时间去检索所有的key,把所有过期的key进行一个删除。

惰性删除:我们把设置好的key放入内存中,当我们使用的时候,检测一下我们使用的key是不是过期了,如果过期了我们就删除。

实际情况下是使用定期删除和惰性删除连两个方法结合。

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

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

相关文章

【计算机毕业设计】基于SSM++jsp的网络游戏公司官方平台系统【源码+lw+部署文档+讲解】

目录 第1章 绪论 1.1 课题背景 1.2 课题意义 1.3 研究内容 第2章 开发环境与技术 2.1 MYSQL数据库 2.2 JSP技术 2.3 SSM框架 第3章 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 系统流程 3.2.1 操作流程 3.2.2 登录流程 3.2.3 删除信息流…

我写了一套几乎无敌的参数校验组件!基于 SpEL 的参数校验组件「SpEL Validator」

前言 大家好,我是阿杆,不是阿轩。 参数校验这个东西,很多情况下都是比较简单的,用 NotNull、Size 等注解就可以解决绝大多数场景,但也有一些场景是这些基本注解解决不了的,只能用一些其他的方式处理&…

【极速前进】20240423-20240428:Phi-3、fDPO、TextSquare多模态合成数据、遵循准则而不是偏好标签、混合LoRA专家

一、Phi-3技术报告 论文地址:https://arxiv.org/pdf/2404.14219 ​ 发布了phi-3-mini,一个在3.3T token上训练的3.8B模型。在学术基准和内部测试中的效果都优于Mixtral 8*7B和GPT-3.5。此外,还发布了7B和14B模型phi-3-small和phi-3-medium。…

环形链表理解||QJ141.环形链表

在链表中,不光只有普通的单链表。之前写过的的一个约瑟夫环形链表是尾直接连向头的。这里的环形链表是从尾节点的next指针连向这链表的任意位置。 那么给定一个链表,判断这个链表是否带环。qj题141.环形链表就是一个这样的题目。 这里的思路是用快慢指…

面试笔记——多线程使用场景

线程池使用场景(CountDownLatch, Future) CountDownLatch CountDownLatch(闭锁/倒计时锁)用来进行线程同步协作,等待所有线程完成倒计时(一个或者多个线程,等待其他多个线程完成某件…

经典面试题之滑动窗口专题

class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {// 长度最小的子数组 // 大于等于 targetint min_len INT32_MAX;// 总和int sum 0;int start 0; // 起点for(int i 0; i< nums.size(); i) {sum nums[i];while(sum > targe…

【如此简单!数据库入门系列】之效率基石 -- 磁盘空间管理

文章目录 1 前言2 磁盘空间管理3 磁盘空间管理的实现4 存储对象关系5 总结6 系列文章 1 前言 如何将表中的记录存储在物理磁盘上呢&#xff1f; 概念模式中&#xff0c;记录&#xff08;Record&#xff09;表示表中的一行数据&#xff0c;由多个列&#xff08;字段或者属性&…

mysql5.7数据库安装及性能测试

mysql5.7数据库安装及性能测试 记录Centos7.9下安装mysql 5.7并利用benchmark工具简单测试mysql的性能。 测试机&#xff1a;centos7.9 配置&#xff1a;4C8G40G 1. 下安装mysql5.7 安装mysql5.7&#xff1a; # 通过官方镜像源安装$ wget http://dev.mysql.com/get/mysql57-com…

如何用virtualbox 来跑openwrt 镜像?

1.下载好openwrt源代吗&#xff0c;编译之前先配置&#xff0c;让编译产生x86的virtualbox 镜像&#xff1a; 编译完成之后会产生vdi镜像文件&#xff0c; 在virtualbox 中创建一虚拟机&#xff0c;类型选择linux,版本other linux 64: 内存选择512&#xff1a; 这个地方把镜像…

【牛客】【模板】二维前缀和

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二维前缀和板题。 二维前缀和&#xff1a;pre[i][j]a[i][j]pre[i-1][j]pre[i][j-1]-pre[i-1][j-1]; 子矩阵 左上角为(x1,y1) 右下角(x2,y2…

使用openssl创建https证书

原文地址&#xff1a;使用openssl创建https证书-腾讯云开发者社区-腾讯云 从今天开始笔者打算和大家聊一聊http2这个协议&#xff0c;想要说清楚http2协议就必须亲手搭建一个http2的服务&#xff0c;并且对比http2和http1.1的特点&#xff0c;从而了解http2的一些新特性。 ht…

ESP32 IDF linux下开发环境搭建

文章目录 介绍升级Python环境下载Python包配置编译环境及安装Python设置环境变量 ESPIDF环境搭建下载esp-idf 代码编译等待下载烧录成功查看串口打印 介绍 esp32 官方文档给的不是特别详细 参考多方资料 最后才完成开发 主要问题在于github下载的很慢本教程适用于ubuntu deban…

华为eNSP中型企业局域网网络规划设计(下)

→b站传送门&#xff0c;感谢大佬← →华为eNSP中型企业局域网网络规划设计&#xff08;上&#xff09;← →拓扑图传送门&#xff0c;可以自己配置着玩← 配置ospf AR3 [AR3]ospf 1 router-id 3.3.3.3 //出口默认路由 [AR3-ospf-1]default-route-advertise always #area…

2024上半年软考新规,对高级论文科目不太友好

辽宁省发布了《关于2024年上半年计算机技术与软件专业技术资格(水平)考试批次安排的通知》&#xff0c;通知原文如下&#xff1a; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 1.…

C 语言文件输入/输出(I/O)函数大全

C 语言文件输入/输出&#xff08;I/O&#xff09;函数大全 1. fopen() 函数2. fclose() 函数3. fread() 函数4. fwrite() 函数5. fseek() 函数6. ftell() 函数7. rewind() 函数8. feof() 函数9. ferror() 函数10. clearerr() 函数 &#x1f60a; C 语言文件输入/输出&#xf…

SparkSQL与Hive整合 、SparkSQL函数操作

SparkSQL与Hive整合 SparkSQL和Hive的整合&#xff0c;是一种比较常见的关联处理方式&#xff0c;SparkSQL加载Hive中的数据进行业务处理&#xff0c;同时将计算结果落地回Hive中。 整合需要注意的地方 1)需要引入hive的hive-site.xml&#xff0c;添加classpath目录下面即可…

国家信息安全水平等级考试NISP一级题目(包含答案)

国家信息安全水平等级考试NISP一级题目 有任何想要咨询NISP都可以私信博主 1&#xff0e; 下列关于用户口令说法错误的是&#xff08; &#xff09;。 A.口令不能设置为空 B.口令长度越长&#xff0c;安全性越高 C.复杂口令安全性足够高&#xff0c;不需要定期修改 D.口令认证…

软件测试之 自动化测试 基于Python语言使用Selenium、ddt、unitTest 实现自动化测试

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我会尽力带来有趣的内容 本文档是一年前学后记得笔记 现在居然还记得很清楚 基于…

ASV1000视频监控平台:接入支持JT808标准的设备

目录 一、JT/T 808标准简介 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;标准内容简介 1、消息分类 2、位置信息 3、报警信息 4、车辆控制 5、数据转发 二、在ASV1000上通过JT808添加设备 &#xff08;一&#xff09;登录视频监控平台管理端 &#x…

深度学习之基于Vgg16卷积神经网络乳腺癌诊断系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于VGG16卷积神经网络的乳腺癌诊断系统项目是一个结合深度学习技术和医学图像处理的创新项目&#xff0c;旨在提高…