当前位置: 首页 > 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 需要进行二次身份验证 ; 先登录…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...