当前位置: 首页 > news >正文

关于Redis的持久化

目录

RDB

  1.手动触发

   2.自动触发

AOF 

aof的重写机制


Redis虽然是一个内存数据库,但是也是可以将数据存储到硬盘中的,也就是持久化。硬盘的数据是在Redis重启的时候,用来恢复内存中的数据的,即对数据做了一个备份。Redis实现持久化具体是按照RDBAOF两种策略来实现的。当同时开启RDB和AOF的时候,以AOF为主。

RDB

   即Redis database,是指定期把Redis中的数据写入硬盘中,生成一个“快照”,存储在硬盘中。后续Redis一旦重启了(内存数据没了),就可以根据刚才的“快照”把内存中的数据恢复回来。

redis加载RDB恢复数据的速度远远快于AOF的方式,因为RDB是用二进制的方式来组织数据的,AOF是使用文本的方式组织数据的。

  “定期”具体说来,又有两种方式:

  1.手动触发

      程序员通过redis客户端,执行特定的命令,来触发快照生成。

       主要有两个命令:

        save:redis会全力以赴的生成“快照生成”的操作,此时就会阻塞redis的其他客户端的命令。会直接在当前进程中,往同一个rdb文件中写入数据。

        bgsave:bg => background(后面),不会影响redis服务器处理其他客户端的请求和命令。此处redis使用的是“多进程”的方式,来完成并发编程。流程如下

        1.判定当前是否已经存在其他正在工作的子进程。如果当前已经有一个子进程正在执行bgsave,此时就直接把当前的bgsave返回。

        2.如果没有其他的工作进程,就通过fork这样的系统调用创建出一个子进程。fork是linux系统提供的一个创建子进程的api。fork创建子进程直接把当前的进程(父进程)复制一份,作为子进程,子进程的内存里会存储和父进程一样的数据。一旦复制完成了,父子进程就是两个独立的进程,就各自执行各自的了。接下来安排子进程去执行“持久化”操作。

        3.子进程负责进行写RDB文件,生成快照的过程。父进程继续接收客户的请求,正常提供服务。

        4.子进程完成整体的持久化过程之后,会通知父进程,父进程就会更新一些统计信息。子进程就可以结束销毁了。

       注: rdb持久化操作可以触发很多次。当执行生成rdb镜像操作的时候,此时就会把要生成的快照数据,先保存到一个临时文件中。当这个快照快要生成完毕的时候,再删除之前的rdb文件,把新生成的临时的rdb文件名字改成dump.rdb。就可以保证自始至终,redis中的rdb文件只有一个。

        

   2.自动触发

  自动触发即在Redis配置文件中设置一下,让Redis每个多长时间/每产生多少次修改,就触发。 

  在redis的官方配置文件redis.conf中,关于RDB自动触发的机制是:

save <seconds> <changes>
save 900 1
save 300 10
save 60 10000

   seconds代表触发所需的秒数,changes表示在seconds时间内,内存中key修改的次数。save 900 1 表示在900s内至少存在一次key的修改,则在900s后会执行备份。

  以上的数值都可以修改。但是我们的原则是不能让快照操作执行的太频繁。

注:1.不仅仅是save执行一定时间内修改n次的方法,通过shutdown命令(关闭redis服务器的命令)也能触发生成快照。

2.  当redis进行主从复制的时候,主节点也会自动生成rdb快照,然后把rdb快照内容传输给从节点。

3.  save ""  表示关闭自动生成快照。

如果通过以上正常流程重新启动redis服务器,此时redis服务器会在退出的时候,自动触发生成rdb操作。但是如果是异常重启(kill -9 或服务器掉电)此时redis服务器来不及生成rdb,内存中尚未保存到快照中的数据,就会随着重启而丢失。


AOF 

  RDB的最大问题,在于不能实时的持久化保存数据。在两次生成快照之间,实时的数据可能会随着重启而丢失。

AOF(append only file) 会把用户的每个操作,都记录到文件中。当redis重新启动的时候,就会读取这个aof文件中的内容,用来恢复数据。

当开启aof的时候,rdb就不生效了。aof默认是关闭状态,修改配置文件来开启aof功能。

AOF并不会影响到redis处理请求的速度,原因:

1. AOF机制并非是直接让工作线程把数据写入硬盘,而是先写入一个内存中的缓冲区,积累一波之后,再统一写入硬盘。

2. 硬盘上读写数据,顺序读写的速度是比较快的,随机访问的速度是比较慢的。AOF是每次把新的操作写入到原有文件的末尾,属于顺序写入

由于缓冲区是在内存中,如果主机突然掉电,数据就会丢失。redis给出了一些选项,让程序员根据实际情况来决定如何取舍,也就是缓冲区的刷新策略,刷新频率越高,性能影响就越大,同时数据的可靠性就越高。

always相当于立即刷新,频率最高,数据可靠性最高,性能最低。

everysec 相当于每秒刷新。

no相当于由操作系统自行决定刷新频率。频率最低,数据可靠性最低,性能最高。

默认策略是everysec。

aof的重写机制

redis启动的时候要读取aof文件的内容,但是aof文件中的内容可能存在冗余。redis就存在一个机制能够针对aof文件进行整理操作,这个机制就是能够剔除其中的冗余操作,并且合并一些操作,达到给aof文件瘦身的效果。也就是重写机制(rewrite)。

重写机制的触发方式分为手动触发自动触发

AOF重写的流程

  使用fork的方式创建子进程,父进程仍然负责接收请求,子进程负责针对aof文件进行重写。而此时内存中的数据的状态,就已经相当于是把AOF文件结果整理后的模样了。所以子进程只需要把内存中当前的数据获取出来,以AOF的格式写入到一个新的AOF文件中。

  非常类似于RDB生成快照的过程,只不过RDB是按照二进制的方式生成的。AOF则是按照AOF这里要求的文本格式来生成的。

在子进程写新aof的同时,父进程仍然在不停的接收客户端新的请求。父进程还是会先把这些请求产生的AOF数据先写入到缓冲区再刷新到原有的AOF文件中。

在创建子进程的一瞬间,子进程就继承了当前父进程的内存状态。因此,子进程里的内存数据是父进程fork之前的状态。fork之后,新来的请求对内存造成的修改,是子进程不知道的。

此时,父进程这里又准备了一个aof_rewrite_buf缓冲区,专门放fork之后收到的数据,专门往新的aof文件去写。

子进程这边,把aof数据全部写完之后,会通过信号通知父进程。父进程再把aof_rewrite_buf缓冲区中的内容也写入到新AOF文件在里。

然后就可以用新的AOF文件代替旧的AOF文件了。

问题:

1、如果,在执行aof_rewrite_buf的时候,当前redis已经在进行aof重写了,会怎样呢?

此时,不会再次执行aof重写,直接返回了。

2、如果,在执行aof_rewrite_buf的时候,发现当前redis在生成rdb文件的快照,会怎样呢?

此时,aof重写操作就会等待,等待rdb快照生成完毕之后,再进行执行aof重写。

3、为什么rdb不在fork之后,也采用类似aof_rewrite_buf缓冲区的方式来处理新数据呢?

rdb本身的设计理念,就是用来“定期备份”的。之要是定期备份,就难以和最新的数据保持一致。

4、父进程在fork后,继续写这个即将消亡的旧的aof文件是否还有意义?

考虑到极端情况,假设在重写到一半的时候,服务器突然掉电,子进程内存的数据就会丢失,新的aof文件内容还不完整,所以如果父进程不坚持写旧aof文件,重启就没法保持数据的完整性了。

以上,关于redis,希望对你有所帮助。

相关文章:

关于Redis的持久化

目录 RDB 1.手动触发 2.自动触发 AOF aof的重写机制 Redis虽然是一个内存数据库&#xff0c;但是也是可以将数据存储到硬盘中的&#xff0c;也就是持久化。硬盘的数据是在Redis重启的时候&#xff0c;用来恢复内存中的数据的&#xff0c;即对数据做了一个备份。Redis实现持…...

【C语言标准库函数】指数与对数函数:exp(), log(), log10()

目录 一、头文件 二、函数简介 2.1. exp(double x) 2.2. log(double x) 2.3. log10(double x) 三、函数实现&#xff08;概念性&#xff09; 3.1. exp(double x) 的模拟实现 3.2. log(double x) 和 log10(double x) 的模拟实现 四、注意事项 4.1. exp(double x) 的注…...

2024美团春招硬件开发笔试真题及答案解析

目录 一、选择题 1、在 Linux,有一个名为 file 的文件,内容如下所示: 2、在 Linux 中,关于虚拟内存相关的说法正确的是() 3、AT89S52单片机中,在外部中断响应的期间,中断请求标志位查询占用了()。 4、下列关于8051单片机的结构与功能,说法不正确的是()? 5、…...

Python内置函数map(), list(), len(), iter(), hex(), hash()的详细解析,包括功能、语法、示例及注意事项

1. map(function, iterable, ...) 功能&#xff1a;对可迭代对象中的每个元素应用指定函数&#xff0c;返回一个迭代器。 参数&#xff1a; function&#xff1a;要执行的函数&#xff08;可以是lambda表达式&#xff09;。 iterable&#xff1a;一个或多个可迭代对象&#x…...

[LVGL] 在VC_MFC中移植LVGL

前言&#xff1a; 0. 在MFC中开发LVGL的优点是可以用多个Window界面做辅助扩展【类似GUIguider】 1.本文基于VC2022-MFC单文档框架移植lvgl8 2. gitee上下载lvgl8.3 源码&#xff0c;并将其文件夹改名为lvgl lvgl: LVGL 是一个开源图形库&#xff0c;提供您创建具有易于使用…...

MySQL视图索引操作

创建学生表&#xff1b; mysql> create table Student(-> Sno int primary key auto_increment,-> Sname varchar(30) not null unique,-> Ssex char(2) check (Ssex男 or Ssex女) not null,-> Sage int not null,-> Sdept varchar(10) default 计算机 not …...

一次奇怪的空指针问题分析:事务、死锁与隐式回滚

最近我们在排查一个诡异的 空指针异常&#xff0c;整个分析过程可以说是跌宕起伏&#xff0c;最终的结论也颇具隐蔽性。今天就把这个问题分享出来&#xff0c;希望对大家有所帮助。 问题现象 在系统中&#xff0c;我们有 单据 B&#xff0c;它通过一个 关联 ID 字段与 上级单…...

解决aspose将Excel转成PDF中文变成方框的乱码问题

原文网址&#xff1a;解决aspose将Excel转成PDF中文变成方框的乱码问题_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决aspose将Excel转成PDF中文变成方框的乱码问题。 问题描述 用aspose将word、excel等转成PDF后&#xff0c;英文展示正常&#xff0c;但中文全部变成了…...

.net8.0使用EF连接sqlite数据库及使用Gridify实现查询的简易实现

EF Core EF Core 是一个流行的对象关系映射&#xff08;ORM&#xff09;框架&#xff0c;它简化了与数据库的交互&#xff0c;提供了一个高效、灵活且易于使用的数据访问层。 Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技…...

2025.2.5——五、[网鼎杯 2020 青龙组]AreUSerialz

题目来源&#xff1a;BUUCTF [网鼎杯 2020 青龙组]AreUSerialz 一、打开靶机&#xff0c;整理信息 直接得到一串php代码&#xff0c;根据题目可以看到还有序列化 二、解题思路 step 1&#xff1a;代码审计 <?phpinclude("flag.php");highlight_file(__FILE__…...

电风扇各国检测认证详细介绍美国FCC+UL欧盟CE+ROHS日本PSE+METI备案+英国UKCA

美国 &#xff1a; FCC认证 &#xff1a;产品进入美洲市场的通行证&#xff0c;需通过FCC SDOC认证。 FCC第15部分B: 该标准适用于非故意辐射设备&#xff0c;如家用电器、电脑设备等。它规定了这些设备在电磁环境中不会产生过多的辐射。 ​射频标准: FCC第15部分C:该标准适…...

Flutter Isolate解决耗时任务导致卡死

先来对比一下在Flutter的ui主线程下直接计算一个耗时任务的情况&#xff1a; import package:flutter/material.dart;void main() {runApp(const MaterialApp(home: H(),)); }class H extends StatefulWidget {const H({super.key});overrideState<H> createState() >…...

使用deepseek快速创作ppt

目录 1.在DeekSeek生成PPT脚本2.打开Kimi3.最终效果 DeepSeek作为目前最强大模型&#xff0c;其推理能力炸裂&#xff0c;但是DeepSeek官方没有提供生成PPT功能&#xff0c;如果让DeepSeek做PPT呢&#xff1f; 有个途径&#xff1a;在DeepSeek让其深度思考做出PPT脚本&#xf…...

STM32的HAL库开发---高级定时器---输出比较模式实验

一、高级定时器输出比较模式实验原理 定时器的输出比较模式总共有8种&#xff0c;本文使用其中的翻转模式&#xff0c;当TIMXCCR1TIMXCNT时&#xff0c;翻转OC1REF的电平&#xff0c;OC1REF为输出参考信号&#xff0c;高电平有效&#xff0c;OC1REF信号连接到0C1上面&#xff…...

python Excel 表读取合并单元格以及清除空格符

读取合并单元格并保留合并信息 读取合并单元格并保留合并信息清除各单元格的空格和换行符&#xff0c;并去除列名中的空格和换行符 读取合并单元格并保留合并信息 当我们只是使用 pandas 的 read_excel 方法读取 Excel 文件时&#xff0c;我们可能会遇到一个很棘手的问题&…...

额外题目汇总2-链表

链表 1.24. 两两交换链表中的节点 力扣题目链接(opens new window) 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 思路 使用虚拟头结点会很方便&#xff…...

C#控件开发6—指示灯

按钮功能&#xff1a;手自动旋转&#xff0c;标签文本显示、点击二次弹框确认&#xff08;源码在最后边&#xff09;&#xff1b; 【制作方法】 找到控件的中心坐标&#xff0c;画背景外环、内圆&#xff1b;再绘制矩形开关&#xff0c;进行角度旋转即可获得&#xff1b; 【关…...

探索从传统检索增强生成(RAG)到缓存增强生成(CAG)的转变

在人工智能快速发展的当下&#xff0c;大型语言模型&#xff08;LLMs&#xff09;已成为众多应用的核心技术。检索增强生成&#xff08;RAG&#xff09;&#xff08;RAG 系统从 POC 到生产应用&#xff1a;全面解析与实践指南&#xff09;和缓存增强生成&#xff08;CAG&#x…...

【学习总结|DAY036】Vue工程化+ElementPlus

引言 在前端开发领域&#xff0c;Vue 作为一款流行的 JavaScript 框架&#xff0c;结合 ElementPlus 组件库&#xff0c;为开发者提供了强大的构建用户界面的能力。本文将结合学习内容&#xff0c;详细介绍 Vue 工程化开发流程以及 ElementPlus 的使用&#xff0c;助力开发者快…...

【GitHub】GitHub 2FA 双因素认证 ( 使用 Microsoft Authenticator 应用进行二次验证 )

文章目录 一、GitHub 的 2FA 双因素认证二、使用 Microsoft Authenticator 应用进行二次验证1、TOTP 应用2、下载 Microsoft Authenticator 应用3、安装使用 Authenticator 应用 三、恢复码重要性 一、GitHub 的 2FA 双因素认证 现在登录 GitHub 需要进行二次身份验证 ; 先登录…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...