关于Redis的持久化
目录
RDB
1.手动触发
2.自动触发
AOF
aof的重写机制
Redis虽然是一个内存数据库,但是也是可以将数据存储到硬盘中的,也就是持久化。硬盘的数据是在Redis重启的时候,用来恢复内存中的数据的,即对数据做了一个备份。Redis实现持久化具体是按照RDB和AOF两种策略来实现的。当同时开启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虽然是一个内存数据库,但是也是可以将数据存储到硬盘中的,也就是持久化。硬盘的数据是在Redis重启的时候,用来恢复内存中的数据的,即对数据做了一个备份。Redis实现持…...

【C语言标准库函数】指数与对数函数:exp(), log(), log10()
目录 一、头文件 二、函数简介 2.1. exp(double x) 2.2. log(double x) 2.3. log10(double x) 三、函数实现(概念性) 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, ...) 功能:对可迭代对象中的每个元素应用指定函数,返回一个迭代器。 参数: function:要执行的函数(可以是lambda表达式)。 iterable:一个或多个可迭代对象&#x…...

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

MySQL视图索引操作
创建学生表; 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 …...

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

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

.net8.0使用EF连接sqlite数据库及使用Gridify实现查询的简易实现
EF Core EF Core 是一个流行的对象关系映射(ORM)框架,它简化了与数据库的交互,提供了一个高效、灵活且易于使用的数据访问层。 Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技…...

2025.2.5——五、[网鼎杯 2020 青龙组]AreUSerialz
题目来源:BUUCTF [网鼎杯 2020 青龙组]AreUSerialz 一、打开靶机,整理信息 直接得到一串php代码,根据题目可以看到还有序列化 二、解题思路 step 1:代码审计 <?phpinclude("flag.php");highlight_file(__FILE__…...
电风扇各国检测认证详细介绍美国FCC+UL欧盟CE+ROHS日本PSE+METI备案+英国UKCA
美国 : FCC认证 :产品进入美洲市场的通行证,需通过FCC SDOC认证。 FCC第15部分B: 该标准适用于非故意辐射设备,如家用电器、电脑设备等。它规定了这些设备在电磁环境中不会产生过多的辐射。 射频标准: FCC第15部分C:该标准适…...
Flutter Isolate解决耗时任务导致卡死
先来对比一下在Flutter的ui主线程下直接计算一个耗时任务的情况: 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作为目前最强大模型,其推理能力炸裂,但是DeepSeek官方没有提供生成PPT功能,如果让DeepSeek做PPT呢? 有个途径:在DeepSeek让其深度思考做出PPT脚本…...

STM32的HAL库开发---高级定时器---输出比较模式实验
一、高级定时器输出比较模式实验原理 定时器的输出比较模式总共有8种,本文使用其中的翻转模式,当TIMXCCR1TIMXCNT时,翻转OC1REF的电平,OC1REF为输出参考信号,高电平有效,OC1REF信号连接到0C1上面ÿ…...
python Excel 表读取合并单元格以及清除空格符
读取合并单元格并保留合并信息 读取合并单元格并保留合并信息清除各单元格的空格和换行符,并去除列名中的空格和换行符 读取合并单元格并保留合并信息 当我们只是使用 pandas 的 read_excel 方法读取 Excel 文件时,我们可能会遇到一个很棘手的问题&…...

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

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

探索从传统检索增强生成(RAG)到缓存增强生成(CAG)的转变
在人工智能快速发展的当下,大型语言模型(LLMs)已成为众多应用的核心技术。检索增强生成(RAG)(RAG 系统从 POC 到生产应用:全面解析与实践指南)和缓存增强生成(CAG&#x…...
【学习总结|DAY036】Vue工程化+ElementPlus
引言 在前端开发领域,Vue 作为一款流行的 JavaScript 框架,结合 ElementPlus 组件库,为开发者提供了强大的构建用户界面的能力。本文将结合学习内容,详细介绍 Vue 工程化开发流程以及 ElementPlus 的使用,助力开发者快…...

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

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

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) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: 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组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...

视觉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. 完整损失函数 二…...