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

Redis的AOF持久化、重写机制、RDB持久化、混合持久化

1、AOF持久化

1.1.AOF持久化大致过程

概括:命令追加(append)、文件写入文件同步(sync)

Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候,先去读取这个文件里的命令,并且执行它,于是恢复了缓存数据。

分析:AOF持久化过程中先执行写操作命令后,再写日志好处和坏处。

好处:1.避免额外的检查开销。2.不会阻塞当前写操作命令的执行。

坏处:1.还未写入磁盘的这个数据就会有丢失的风险。2.可能会给「下一个」命令带来阻塞风险。(原因是因为将命令写入到日志的这个操作和执行命令都是在主进程。也就是说这两个操作是同步的。)

1.2.AOF文件里记录什么

1.3.三种写入磁盘的策略

写入磁盘的大致过程:

  • 每次写操作命令执行完后,会将命令追加到 server.aof_buf 缓冲区。

  • 然后通过 write() 系统调用,将 aof_buf 缓冲区的数据写入到 AOF 文件的内存缓冲区

  • 至于何时将内存缓冲区的数据写入磁盘,即.aof文件。由各自的策略决定。

补充:操作系统默认是等到缓冲区的空间被填满、或者超过了指定的时限之后, 才真正地将缓冲区中的数据写入到磁盘里面。这种做法虽然提高了效率, 但也为写入数据带来了安全问题, 因为如果计算机发生停机, 那么保存在内存缓冲区里面的写入数据将会丢失。因此系统提供了 fsync 和 fdatasync 两个同步函数, 它们可以强制让操作系统立即将缓冲区中的数据写入到硬盘里面, 从而确保写入数据的安全性。

1.3.1.Always

每次写操作命令执行完后,会将命令追加到 server.aof_buf 缓冲区。将 aof_buf 缓冲区中的所有内容写入到 AOF 文件, 并同步将 AOF 日志数据写入硬盘;

从安全性来说, always 也是最安全的, 因为即使出现故障停机, AOF 持久化也只会丢失一个事件循环中所产生的命令数据。

从效率上说,效率慢。因为写入磁盘的过程也是在主线程完成的。

1.3.2.Everysec

每次写操作命令执行完后,会将命令追加到 server.aof_buf 缓冲区。将 aof_buf 缓冲区中的所有内容写入到 AOF 文件, 并且每隔超过一秒就要在子线程中对 AOF 文件进行一次同步。

从效率上来讲, everysec 模式足够快, 并且就算出现故障停机, 数据库也只丢失一秒钟的命令数据。

1.3.3.No

每次写操作命令执行完后,会将命令追加到 server.aof_buf 缓冲区。将 aof_buf 缓冲区中的所有内容写入到 AOF 文件, 至于何时对 AOF 文件进行同步, 则由操作系统控制。

从效率上来讲,因为无须执行同步操作, 所以该模式下的 AOF 文件写入速度总是最快的。

1.4.AOF 重写机制

1.4.1.AOF 重写机制过程
  • 为了解决AOF文件过大的问题,于是引入AOF重写机制。

  • 重写机制是通过 fork 出一个子进程来完成的,子进程会扫描 Redis 的数据库,读取每个键的值,用一条命令代替原来的多条命令。然后写入到一个新的AOF文件中。

  • 在子进程进行 AOF 重写的过程中,主进程还会继续接收和处理客户端的请求,如果有新的写操作发生,主进程会将这些写操作追加到一个AOF重写缓冲区AOF缓冲区中。

  • 当子进程完成AOF重写工作之后,它会向父进程发送一个信号。

  • 父进程在接到该信号之后,会调用一个信号处理函数:将AOF重写缓冲区中的所有内容写入到新AOF文件中;新AOF文件代替现有的AOF文件。

  • 完成AOF后台重写。

1.4.2.何时会触发重写机制
  • AOF 重写机制可以由用户手动触发,也可以由系统自动触发 。

  • 用户手动触发 AOF 重写机制可以通过执行 BGREWRITEAOF 命令来实现 。

  • 系统自动触发 AOF 重写机制可以通过配置文件中的 auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size 参数来控制 。

  • auto-aof-rewrite-percentage 参数表示当当前 AOF 文件大小超过上次重写后 AOF 文件大小的百分比时,触发 AOF 重写机制,默认值为 100 。

  • auto-aof-rewrite-min-size 参数表示当当前 AOF 文件大小超过指定值时,才可能触发 AOF 重写机制,默认值为 64 MB 。

  • 系统自动触发 AOF 重写机制还需要满足以下条件 :

    • 当前没有正在执行 BGSAVE 或 BGREWRITEAOF 的子进程

    • 当前没有正在执行 SAVE 的主进程

1.4.3.补充的点
  1. aof_rewrite函数可以很好地完成创建一个新AOF文件的任务并进行大量的写入操作,所以调用这个函数的线程将被长时间阻塞,因为Redis服务器使用单个线程来处理命令请求,所以如果由服务器直接调用aof_rewrite函数的话,那么在重写AOF文件期间,服务期将无法处理客户端发来的命令请求。因此选择开启子进程进行AOF重写。

  2. fork的过程:把主进程的页表复制一份给子进程,而不会复制物理内存,此时主进程和子进程都共享物理内存。

  3. 当主进程修改内存页之前,会复制一个该页的副本,并将其分配给执行写操作的进程。而子进程仍然共享未修改的物理内存页。这个过程叫做写时复制

  1. 写入AOF缓冲区是为了对现有AOF文件的处理工作会如常进行。

  2. 在AOF重写过程中,只有fork页表、写时复制、信号处理函数会影响主线程。在其他时候,AOF 后台重写都不会阻塞主进程。

2、RDB持久化

2.1.RDB持久化过程

  • 执行savebgsave命令,生成RDB文件。save和bgsave区别在于是否在主线程生成RDB文件。

  • 执行 bgsave 命令的时候,会在子进程中生产RDB文件。通过 fork() 创建子进程,此时子进程和父进程是共享同一片物理内存。

  • 当主进程要进行写操作时,就会写时复制。而主线程刚修改的数据,是没办法在这一时间写入 RDB 文件的,RDB 文件保存的是原本的内存数据。只能交由下一次的 bgsave 生产RDB文件。

  • 服务器启动时就会自动执行RDB文件的加载。

2.2.何时进行RDB持久化

Redis 通过配置文件的选项来实现每隔一段时间自动执行一次 bgsave 命令,默认会提供以下配置:

save 900 1
save 300 10
save 60 10000

只要满足上面条件的任意一个,就会执行 bgsave,它们的意思分别是:

900 秒之内,对数据库进行了至少 1 次修改;

300 秒之内,对数据库进行了至少 10 次修改;

60 秒之内,对数据库进行了至少 10000 次修改。

以上分析,

RDB持久化和AOF持久化都有各自的优点:执行RDB文件数据恢复更快。而AOF文件能确保数据丢失少。毕竟人家是执行一条写操作就记录到AOF文件中。而RDB文件是隔一段时间才进行全量写入。

3、Redis 混合持久化

3.1.混合持久化过程

  • 混合持久化工作在 AOF 日志重写过程

  • 在AOF重写过程中,fork出的子进程,以RDB的方式写入AOF文件中。

  • 期间主进程进行的写操作记录在AOF重写缓冲区中。当子进程执行重写完成后,父进程将AOF重写缓冲区中的所有内容写入以AOF方式写入AOF文件。

  • 这样,AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据

  • 重启 Redis 加载数据的时候,由于前半部分是 RDB 内容,这样加载的时候速度会很快。

  • 混合持久化的优点是:

    • 可以减少 AOF 文件的大小,节省磁盘空间

    • 可以加快数据恢复的速度,避免执行大量的 AOF 命令

    • 可以避免数据丢失,因为 RDB 文件和 AOF 文件都有最新的数据快照

3.2.如何开启混合持久化

  • 要开启混合持久化,需要在 redis.conf 文件中设置以下参数:

    • appendonly yes 开启 AOF 持久化

    • aof-use-rdb-preamble yes 开启混合持久化

4、Redis的内存大key的对持久化的影响

  • 写入磁盘策略如果是Always,那么在调用fsync同步函数写入磁盘的时间就会变长,对主线程有一定的阻塞。

  • 在AOF重写过程、RDB持久化过程中,fork页表时、写时复制耗时都会变长,从而影响主线程。

 

相关文章:

Redis的AOF持久化、重写机制、RDB持久化、混合持久化

1、AOF持久化 1.1.AOF持久化大致过程 概括:命令追加(append)、文件写入、文件同步(sync) Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候&#…...

Dom4j使用xpath查询xml文

Dom4j使用xpath查询带有命名空间的xml文件 方式1 忽略命名空间 DocumentFactory factory DocumentFactory.getInstance(); SAXReader reader new SAXReader(factory); Document document reader.read(xmlFilePath); Element rootElement document.getRootElement(); Nod…...

国家专精特新小巨人企业指标解析与扶持领域

一、什么是国家专精特新小巨人 (一)概念与定义 专精特新“小巨人”企业是指那些在细分市场中具有专业化、精细化、特色化和新颖化特征的中小企业中的佼佼者。这些企业在创新能力强、市场占有率高、掌握关键核心技术以及质量效益方面表现突出&#xff0…...

进程的属性

tips: task_struct就是linux下的PCB 操作系统不相信任何外部用户,而是只提供窗口,不可能直接与用户打交道,而是通过操作系统 tast_struct用来描述所有进程,用来管理 ; 和 && 可以同时跑两个命令 进…...

Git 中的refs

在 Git 中,refs 是用来存储 Git 对象(如提交、树、标签等)的引用。每个 ref 都是一个指针,指向一个特定的 Git 对象。以下是 Git 中几种常见的 refs 及其含义: 1. refs/heads/ 表示:本地分支。 用途&…...

408算法题leetcode--第六天

58. 最后一个单词的长度 58. 最后一个单词的长度思路:反向遍历时间:O(n);空间:O(1) class Solution { public:int lengthOfLastWord(string s) {int id s.size() - 1;while(s[id] ){--id;}int ret 0;while(id > 0 &&…...

ubuntu64位系统无法运行32位程序的解决办法

在 64 位的 Ubuntu 系统上运行 32 位程序时,如果出现问题,可能是由于缺少 32 位库支持。以下步骤可以帮助你解决这一问题: 1. 启用 32 位架构 首先,确保系统支持 32 位架构。你可以通过以下命令添加 32 位架构支持: …...

深入理解Go语言中的并发封闭与for-select循环模式

在现代编程中,并发已经成为提高程序性能和响应能力的关键手段。然而,在并发环境下,如何安全地访问和操作共享数据却是一大挑战。本文将深入探讨Go语言中的**封闭(confinement)**技术,以及常见的for-select循环模式,帮助您编写更高效、更安全的并发代码。 并发编程中的安…...

Java学习Day42:骑龙救!(springMVC)

springMVC与sevlet都是对应表现层web的,但是越复杂的项目使用SpringMVC越方便 基于Java实现MVC模型的轻量级web框架 目标: 小案例: 1.导入依赖 spring-context: 提供 Spring 框架的核心功能,如依赖注入、事件发布和其他应用上…...

原型模式详细介绍和代码实现

🎯 设计模式专栏,持续更新中, 欢迎订阅:JAVA实现设计模式 🛠️ 希望小伙伴们一键三连,有问题私信都会回复,或者在评论区直接发言 Java实现原型模式 介绍: 原型模式(Prototype Patte…...

ArcGIS Pro SDK (十三)地图创作 5 图层样式

ArcGIS Pro SDK (十三)地图创作 5 图层样式 文章目录 ArcGIS Pro SDK (十三)地图创作 5 图层样式1 风格管理1.1 如何按名称获取项目中的样式1.2 如何创建新样式1.3 如何向项目添加样式1.4 如何从项目中删除样式1.5 如何将样式项添加到样式1.6 如何从样式中删除样式项1.7 如…...

【Python报错已解决】 Requests.exceptions.ProxyError: HTTPSConnectionPool

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

现在量化中普遍使用QMT和PTrade?哪家可以同时提供QMT/PTrade?

QMT的特点 全面的功能集成: QMT集成了行情显示、策略研究、交易执行和风控管理于一体,为投资者提供了一站式的量化交易解决方案。 高效的交易执行能力: 通过全内存交易实现低延迟的交易执行,单笔延时小于1ms,确保了交易…...

【计算机网络】UDP 协议详解及其网络编程应用

文章目录 一、引言二、UDP1、UDP的协议格式2、UDP 报文的解包和分用3、UDP面向数据报的特点 三、UDP输入输出四、UDP网络编程 一、引言 UDP(User Datagram Protocol,用户数据报协议)是一种网络通信协议,它属于传输层的协议。是一…...

基于ESP32S3的链接大语言模型对话模块

本实物模块从实物外观、模块组成、API申请及功能说明四部分来介绍这款基于ESP32S3的大语言模型对话模块。 1、实物外观 2、模块介绍 本硬件平台主要由三个模块组成,包括MAX9814录音模块、MAX98357音频功放模块和ESP32S3模块。如下图所示。 MAX9814录音模块&#…...

Cpp输出多字符常量警告

Cpp输出多字符常量警告 Cpp中用单引号(single quotes)表示单个字符(single character),例如a,$,用双引号(double quotes)表示字符串文本(text),例如"Hello World! " 当在一个单引号里面存在多个字符时,Cpp…...

Maven从入门到精通(二)

一、什么是pom.xml pom.xml是Maven项目的核心配置文件,它是 项目对象模型 - Project Object Model(POM)的缩写。POM定义了项目的所有属性,包括项目的名称、版本、依赖关系、构建配置等。使用pom.xml,我们可以轻松地管…...

【Kubernetes】常见面试题汇总(二十四)

目录 71.假设一家公司想要修改它的部署方法,并希望建立一个更具可扩展性和响应性的平台。您如何看待这家公司能够实现这一目标以满足客户需求? 72.考虑一家拥有非常分散的系统的跨国公司,期待解决整体代码库问题。您认为公司如何解决他们的问…...

最低成本的游戏串流方案分享 如何自己打造云电脑?

今天教大家如何最低成本实现串流 出门在外也可以随时随地游玩端游大作 硬件准备:一台电脑 手机/平板一台 软件:Gameviewer远程 为啥不用moonlight等其他软件呢 因为设置公网穿透等复杂操作对小白来说不太友好 而GameViewer从安装到使用仅需一键 对比同类…...

python运行时错误:找不到fbgemm.dll

python运行时错误:找不到fbgemm.dll 报错: OSError: [WinError 126] 找不到指定的模块。 Error loading "D:\program\py\312\Lib\site-packages\torch\lib\fbgemm.dll" or one of its dependencies. 原因是Windows下缺失:libomp140…...

给虚拟机linux系统安装交叉编译工具链

我们在电脑上写的代码编译生成的是X86架构的二进制文件,只能在X86平台上运行,而开发板是ARM架构因此需要安装交叉编译链工具,这样在电脑上写的代码交叉编译之后生成的是ARM架构的二进制文件。 绿色的字眼是与本文无关的只是这样有助于我们的…...

Redhat 7,8系(复刻系列) 一键部署Oracle21c-xe rpm

Oracle21c-xe前言 无论您是开发人员、DBA、数据科学家、教育工作者,还是仅仅对数据库感兴趣,Oracle Database Express Edition (XE) 都是理想的入门方式。它是全球企业可依赖的强大的 Oracle Database,提供简单的下载、易于使用和功能齐全的体验。您可以在任何环境中使用该…...

Web植物管理系统-下位机部分

本节主要展示上位机部分,采用BSP编程,不附带BSP中各个头文件的说明,仅仅是对main逻辑进行解释 main.c 上下位机通信 通过串口通信,有两位数据验证头(verify数组中保存对应的数据头 0xAA55) 通信格式 上位发送11字节…...

leetcode169. 多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums [3,2,3] 输出:3 示例…...

从大脑图谱/ROI中提取BOLD信号

动机 在功能连接(Functional Connectivity,FC)构建过程中,由于FC中元素数目是节点数目的平方关系,所以在计算FC之前进行数据降维是一个常见的选择。 一般会将体素级/顶点级BOLD信号(在2mm的图像分辨率下大脑…...

Java-数据结构-优先级队列(堆)-(一) (;´д`)ゞ

文本目录: ❄️一、优先级队列: ➷ 1、概念: ❄️二、优先级队列的模拟实现: ➷ 1、堆的概念: ➷ 2、堆的性质: ➷ 3、堆的创建: ▶ 向下调整: ➷ 4、堆的插入和删除: …...

工厂模式(二):工厂方法模式

一、概念 工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。从而使得系统更加灵活。客户端可以通过调用工厂方法来创建所需的产品,而不必…...

【洛谷】P11036 【MX-X3-T3】「RiOI-4」GCD 与 LCM 问题 的题解

【洛谷】P11036 【MX-X3-T3】「RiOI-4」GCD 与 LCM 问题 的题解 题目传送门 题解 神奇构造题qaq 简化一下下题目,就是要求 a b c d gcd ⁡ ( a , b ) lcm ⁡ ( c , d ) a b c d \gcd(a, b) \operatorname{lcm}(c,d) abcdgcd(a,b)lcm(c,d) 分类讨论 …...

MyBatis系统学习(三)——动态SQL

MyBatis 是一款优秀的持久层框架,它通过 XML 或注解方式将 SQL 语句与 Java 对象映射起来。动态 SQL 是 MyBatis 中非常强大的功能之一,能够根据不同的条件动态生成 SQL 语句。动态 SQL 通过各种标签来灵活生成 SQL,从而避免了在代码中拼接 S…...

get_property --Cmakelist之中

get_property 是 CMake 中用于获取目标、目录、变量或文件等属性的命令。它可以提取某个特定属性的值&#xff0c;以便在构建脚本的其他地方使用。 语法 get_property(<variable> <TYPE> <name> PROPERTY <property-name> [SET | DEFINED | BRIEF_DO…...