redis持久化存储,rdb快照文件,aof文件

news2024/12/24 9:07:14

redis作为内存数据库,在内存中进行读写操作,将读写操作从毫秒级别降为纳秒级别,得到极大的性能提升,与此同时,作为内存数据库其也有致命缺陷,一旦redis发生意外宕机,那么内存中的数据将全部消失,无法找回,为了防止这种情况,redis提供了两种持久化存储的方式,分别是rdb文件,以及aof文件。

rdb文件

redis可以通过save命令生成一个rdb文件,rdb文件内部保存了当前数据的副本,并且通过算法优化压缩,将文件体积大大减小,但生成rdb文件需要将整个内存中的数据全部进行复制,这无疑是及其耗时的操作,如果周期性执行这种命令,则会造成redis的周期行卡顿,所以redis还有另一种方式,通过bgsave命令进行写时复制,那么什么是写时复制呢?

写时复制是通过操作系统提供的fork系统调用来实现的,fork系统调用会创建出一个子进程,和父进程执行相同的代码(fork调用时刻以下的),并且和父进程共享内存空间,也就是读操作是读相同的内存空间,并且将内存空间变为只读,当父进程想要修改内存页时,会向操作系统抛出异常,操作系统识别到异常后,会复制一份当前操作的内存页(操作系统中无论是内存是页式存储)的副本交给父进程进行修改。

所以redis实现写时复制的流程是,首先调用fork,创建子进程,fork会返回一个id,如果当前时父进程,则返回子进程id,如果是子进程则返回0,通过这个,判断当前执行代码的是哪个进程,如果是父进程,则继续监听读写操作,如果有写操作,操作系统会复制内存页供父进程修改。如果当前是子进程,则进行内存数据的读取,并且生成rdb文件,实现代码大致如下。

pid_t pid = fork();
​
    if (pid < 0) {
        // fork 失败
        perror("fork");
        exit(EXIT_FAILURE);
    } else if (pid == 0) {
        // 子进程
        //执行读取内存数据,生成rdb文件的操作......
    } else {
        //父进程
        //执行监听读写操作,修改数据
    }

大致流程如下图,其中红色箭头为子进程复制rdb文件的流程,蓝色为内存页被复制前,父进程的流程,紫色为内存页被复制后父进程的流程。

在redis的配置文件中,我们可以通过配置如下参数,让redis定期执行写时复制

save 900 1     # 900秒内至少有1次写操作
save 300 10    # 300秒内至少有10次写操作
save 60 10000  # 60秒内至少有10000次写操作

aof文件

rdb文件可以通过周期性生成更新保存绝大多数数据,但在对数据安全性较高的情况下,rdb还是避免不了丢失一部分数据,而aof文件,则是提供了另一种解决方案。

aof文件是通过保存执行写操作的指令,以达到持久化存储的目的,其首先在执行写操作时,redis会将写操作指令读取到aof缓冲区,并且根据不同的频率将缓冲区内容写入aof文件,其有三种频率,通过配置appendfsync来进行调整,分别是no(由操作系统决定,性能最好,但丢失数据最多),everysec(折中方案,每秒读取一次日志文件,丢失一秒的数据),always(不丢失数据,性能最查),在高可用集群环境下,我们通常会采取always进行保存。

虽然aof是保存指令而不是数据,但是aof没有算法对其进行压缩,所以aof文件体积较大,为了优化aof体积,redis采用了一种定期更新aof文件的方式(对一个数据多次修改,其实只有最后一次有用,前面保存的都是多余的指令),可以通过如下配置自定义

auto-aof-rewrite-percentage 100  # 当 AOF 文件大小达到上次重写后的两倍时,触发重写
auto-aof-rewrite-min-size 64mb   # AOF 文件最小达到 64MB 时才会触发重写

其中第一个配置是百分比,也就是增大了百分之百后重写aof,第二个配置是最小大小,也就是说即使你已经增大了既定的百分比,你也要达到64mb才能重写。而重写的过程则是便利内存中全部的数据,并将数据变成对应的执行,比如说string类型变成set指令,hash类型变成hset指令。

aof缓冲区到磁盘的过程是在主线程执行的,其会阻塞redis代码的执行,而aof重写则是写时复制,跟rdb写时复制流程相同,只不过子线程执行的逻辑变成了将内存数据读取成aof文件。

当rdb和aof文件都存在时,redis的数据恢复会优先读取aof文件,如果没有aof文件或者aof文件读取失败,才会读取rdb文件。

rdb和aof结合使用

rdb文件体积小,生成和恢复速度快,但保存文件不完成,而aof则相反,所以可以通过将两者结合,最大化发挥两者的优势,在redis配置文件中可以通过配置aof-use-rdb-preamble为yes开启,在这个模式下,重写aof时会先在aof文件中创建rdb快照,然后在将aof缓冲区的内容追加到rdb快照的后面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1969935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧医院临床检验管理系统源码(LIS),全套LIS系统源码交付,商业源码,自主版权,支持二次开发

实验室信息系统是集申请、采样、核收、计费、检验、审核、发布、质控、查询、耗材控制等检验科工作为一体的网络管理系统。它的开发和应用将加快检验科管理的统一化、网络化、标准化的进程。一体化设计&#xff0c;与其他系统无缝连接&#xff0c;全程化条码管理。支持危机值管…

如何手动修复DLL丢失?2种手动修复dll文件方法

DLL&#xff08;动态链接库&#xff09;文件是Windows操作系统中非常重要的组成部分&#xff0c;它们包含了程序运行所需的代码和数据。然而&#xff0c;由于各种原因&#xff0c;如系统更新、软件卸载不当或病毒感染&#xff0c;DLL文件有时会丢失或损坏&#xff0c;导致程序无…

Python pyautogui 自动控制 MDK Keil_v5 Pack Installer 的 Packs 安装过程

MDK Keil_v5 安装完成后&#xff0c;会自动进行 Pack Installer 的 Packs 安装&#xff0c;安装过程中首先 install 需要一行行用鼠标点&#xff0c;然后每一行的 Pack 都会出现同意安装或连接超时的弹窗&#xff0c;需要鼠标操作确认。 pyautogui 可以帮助自动控制鼠标完成确…

【C++】关于仿函数Functor 的理解和应用

C中的仿函数&#xff08;Functor&#xff09;&#xff1a;深入理解与应用 仿函数的基本概念仿函数在STL中的应用仿函数的分类STL中的常见仿函数 仿函数的优势结论 在C编程中&#xff0c;仿函数&#xff08;Functor&#xff09;是一种特殊的类&#xff0c;它通过重载函数调用运算…

【RabbitMQ】通配符模式(Topics)

一、基本概念 生产者&#xff08;Producer&#xff09;&#xff1a;发送消息到RabbitMQ交换机的程序。生产者定义消息的路由键&#xff0c;用于标识消息的目的地。交换机&#xff08;Exchange&#xff09;&#xff1a;接收生产者发送的消息&#xff0c;并根据路由键和绑定规则…

IT运维中,如何快速进行故障排查?(以银行APP交易故障为例)

一、事件背景 正值"五一"黄金周旅游高峰期&#xff0c;某城商行的手机APP突然出现大面积交易失败和严重卡顿现象。据初步统计&#xff0c;从上午10点开始APP的交易成功率从正常的99%骤降至75%左右&#xff0c;用户反馈的交易失败投诉量在短短2小时内激增了500%。与此…

volatile 关键字的两层语义

volatile 关键字的两层语义 1、可见性2、禁止指令重排序3、工作机制4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; volatile 关键字在Java并发编程中扮演着重要角色&#xff0c;它主要用于保证变量的可见性和禁止指令重排序。 1、…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-63 - Canvas和SVG元素定位

软件测试微信群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 今天宏哥分享的在实际测试工作中很少遇到&#xff0c;比较生僻&#xff0c;如果突然遇到我们可能会脑大、懵逼&#xff0c;一时之间不知道怎么办&#xff1f;所以宏哥这里提供…

redis高持久化、RDB、AOF

redis高可用 redis当中&#xff0c;高可用概念会更宽泛一些。 除了正常服务以外&#xff0c;数据量的扩容&#xff0c;数据安全。 实现高可用的方式&#xff1a; 1、持久化 最简单的高可用方法 主要功能&#xff1a;备份数据 把内存的数据保存到硬盘当中。 2、主从复制 3、…

【CAN通讯系列8】如何准确接收数据?

在 【CAN通讯系列7】波特率是什么&#xff1f;已经介绍了CAN位时间和采样点等概念&#xff0c;每1位由同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2)四个段组成&#xff0c;这个也成为位时序&#xff0c;采样点位置处于PBS1和PBS2的交界处&#xff0c;如…

开源跨平台SQL编辑器:Beekeeper Studio

Beekeeper Studio&#xff1a; 简化SQL体验&#xff0c;提升数据库效率。- 精选真开源&#xff0c;释放新价值。 概览 Beekeeper Studio&#xff0c;一款为现代数据库管理而生的跨平台SQL客户端&#xff0c;以其简洁直观的界面和强大的功能&#xff0c;赢得了开发者和数据库管…

betterzip免费版 betterzip破解版 betterzip注册码密钥 betterzip解压缩软件下载安装教程

基于Mac开发的解压缩软件就那么几款&#xff0c;BetterZip解压缩软件估计是Mac上非常受欢迎的压缩工具。苹果Mac电脑上虽然有自带的归档实用工具&#xff0c;但是功能过于单一&#xff0c;对很多格式的压缩文件无能为力&#xff0c;特别像使用Windows电脑的朋友压缩文件习惯使用…

搜索型和XX型注入

"Pikachu"通常是指一个安全漏洞学习平台&#xff0c;它模拟了各种Web应用中的安全漏洞&#xff0c;以便于学习者实践和了解这些漏洞的工作原理。在这个平台上&#xff0c;你可以找到不同类型的SQL注入漏洞来练习和学习如何利用与防御它们。 搜索型注入&#xff08;也…

同步交互与异步交互:深入解析与选择

同步交互与异步交互&#xff1a;深入解析与选择 1、同步交互2、异步交互3、选择策略 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在软件开发的世界里&#xff0c;交互方式主要分为两大类&#xff1a;同步与异步。下面是对这两种方式的解…

AGI思考探究过程中的意义、价值与乐趣Ⅲ

「融合RL与LLM思想&#xff0c;探寻世界模型以迈向AGI」这篇文章也探究了思维系统的两种推理模式&#xff1a;系统Ⅰ&#xff08;快思考&#xff09;和系统Ⅱ&#xff08;慢思考&#xff09;在推理过程的本质普遍性及表象差异性&#xff0c;以及尝试挖掘快慢思考是否与两类学习…

用于自动驾驶的基于立体视觉的语义 3D 对象和自我运动跟踪

Stereo Vision-based Semantic 3D Object and Ego-motion Tracking for Autonomous Driving 论文 摘要&#xff1a; 我们提出了一种基于立体视觉的方法&#xff0c;用于在动态自动驾驶场景中跟踪相机自我运动和 3D 语义对象。我们建议使用易于标记的 2D 检测和离散视点分类以及…

【SQL Server】网络通信基础

目录 网络通信基础 网络协议概述 TCP/IP 协议栈 端口和地址绑定 网络通信基础 网络协议概述 网络协议是一组规则和标准&#xff0c;定义了数据在网络中的传输方式。这些协议确保不同设备之间的通信顺畅且高效。网络协议分为多个层次&#xff0c;每个层次负责特定的任务。…

直播狂欢下的隐忧|专题报告集

原文链接&#xff1a;https://tecdat.cn/?p37200 从草根逆袭的烤摊主郭有才&#xff0c;仅用9天便突破千万粉丝&#xff0c;日入惊人的380万&#xff0c;到菏泽因直播热潮连夜紧急修路&#xff0c;这一切看似光鲜的背后&#xff0c;实则暗流涌动。 模仿“反诈老陈”、“保安…

Yearning-MYSQL 审计平台部署

目录 一. 环境准备 二. 部署安装 三. 基础使用 1.用户管理 2. 创建SQL审计流程 3. 自定义审核规则 4. 导入数据源 5. 创建权限组 6. 登录用户申请工单 1. 创建一个DDL工单提交 2. SQL审核执行 3. SQL执行 4. 数据验证 Yearning 是一个开源的 MySQL SQL 审计平台…

CTFHUB-文件上传-文件头检查

开启题目 1.php内容&#xff1a; <?php eval($_POST[cmd]);?> 截屏截一个很小很小的图片&#xff0c;保存为 png 格式&#xff0c;把 1.png 和 1.php 放在同一文件夹&#xff0c;在此目录打开 cmd&#xff0c; 使用以下命令把 1.png 和 1.php 合成为图片马 copy 1.pn…