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

告别‘鬼影’与模糊:深入解读RangeNet++如何用高效kNN后处理搞定LiDAR语义分割的边界难题

RangeNet&#xff1a;用GPU加速的kNN后处理破解LiDAR语义分割的边界模糊难题 当自动驾驶车辆以每小时60公里的速度行驶时&#xff0c;每100毫秒的决策延迟意味着1.67米的盲区——这恰好是许多交通事故发生的临界距离。在LiDAR语义分割领域&#xff0c;传统方法在点云投影与反投…...

Promises/A+性能优化指南:让你的异步代码运行得更快

Promises/A性能优化指南&#xff1a;让你的异步代码运行得更快 【免费下载链接】promises-spec An open standard for sound, interoperable JavaScript promises—by implementers, for implementers. 项目地址: https://gitcode.com/gh_mirrors/pr/promises-spec 在Ja…...

零基础新手会议记录,选购避坑指南 可直接上手

日常工作学习中&#xff0c;不少人会遇到会议纪要整理、访谈录音处理、讲座笔记记录的难题&#xff0c;手动整理耗时费力还易出错。本文评测了市面上主流录音转写工具&#xff0c;整理了新手避坑指南和实用选择建议&#xff0c;零基础也能快速上手。综合实测后&#xff0c;听脑…...

JSON格式强制输出失败,深度解析DeepSeek-R1/V3模型token级响应机制与schema约束绕过方案

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;JSON格式强制输出失败的现象与根本归因 典型失败现象 当后端服务&#xff08;如 Go/Node.js/Python&#xff09;尝试通过 HTTP 响应强制输出 JSON 数据时&#xff0c;常出现空响应、500 错误、或返回 …...

ARM Cortex-M3位带操作原理与W55MH32 GPIO实战应用

1. 从51到ARM&#xff1a;为什么我们需要“位带操作”&#xff1f;如果你是从51单片机转过来玩ARM Cortex-M3内核的&#xff0c;比如WIZnet这颗W55MH32&#xff0c;那你肯定对sbit P1_0 P1^0;这种写法再熟悉不过了。在51上&#xff0c;想单独控制一个IO口的高低电平&#xff0…...

Arm Neoverse CMN-650错误处理与事务管理机制解析

1. Arm Neoverse CMN-650错误处理机制深度解析在现代多核处理器系统中&#xff0c;错误处理机制的设计直接影响着系统的可靠性和稳定性。Arm Neoverse CMN-650作为一款高性能一致性网状网络&#xff0c;其错误处理架构展现了精妙的设计理念。1.1 HN-I节点的错误分类与处理HN-I&…...

MacBook远程控制Win10打游戏?聊聊Microsoft Remote Desktop的那些隐藏玩法和限制

MacBook远程控制Win10打游戏&#xff1f;Microsoft Remote Desktop的极限性能测试与实战技巧 当MacBook用户需要临时调用Windows电脑的资源时&#xff0c;远程桌面工具往往成为救急首选。但你是否想过&#xff0c;这类工具能否胜任游戏、视频剪辑甚至3D建模等高图形负载任务&am…...

dingtalk-openclaw-connector:打通钉钉与AI的插件化连接器架构解析

1. 项目概述&#xff1a;一个打通钉钉与AI能力的“连接器”如果你正在企业内部尝试部署AI应用&#xff0c;比如一个能自动处理工单的智能客服&#xff0c;或者一个能帮你分析周报的智能助手&#xff0c;那么你大概率会遇到一个核心难题&#xff1a;如何让AI能力无缝融入员工每天…...

深度解析开源专杀工具openclaw-killer:从恶意软件持久化机制到实战清理

1. 项目概述&#xff1a;一个开源安全工具的诞生最近在安全圈和开源社区里&#xff0c;一个名为nkzprod/openclaw-killer的项目引起了我的注意。乍一看这个标题&#xff0c;你可能会觉得有点“中二”&#xff0c;又是“爪子”又是“杀手”的&#xff0c;但作为一名在安全领域摸…...

初创团队如何借助 Taotoken 的 Token Plan 有效控制大模型使用成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 初创团队如何借助 Taotoken 的 Token Plan 有效控制大模型使用成本 对于初创团队和独立开发者而言&#xff0c;在项目早期验证想法…...