常见面试题-Redis持久化策略

news2025/1/16 3:43:54

谈谈Redis 的持久化策略?

参考文章:

  • Redis 持久化机制演进与百度智能云的实践

Redis的确是将数据存储在内存的,但是也会有相关的持久化机制将内存持久化备份到磁盘,以便于重启时数据能够重新恢复到内存中,避免数据丢失的风险。而Redis持久化机制有三种:AOFRDB混合型持久化(4.x版本后提供)

  • RDB持久化

    关闭 RDB 持久化只需要将 save 保存策略注释掉即可

    RDB持久化的方式有两种:

    • 手动触发(分为手动 save 和手动 bgsave)

      • 手动save:阻塞当前 Redis,直到持久化完成,可能造成长时间阻塞,线上不建议使用。​

      • 手动bgsave:Redis 进程执行 fork 创建子进程进行持久化,阻塞事件很短。在执行Redis-cli shutdown关闭Redis服务时或执行flushall命令时,如果没有开启AOF持久化,自动执行bgsave

    • 被动触发(以下四种情况会被动触发)

      • 达到了在 redis.conf 中配置被动触发的条件,会触发 bgsave 生成 rdb 文件

        Redis 中 save 操作的配置:从右向左条件主键变弱,如果60s发生了10000次写操作,就进行持久化,如果没有达到,在300s时,如果有100次写操作就会持久化,如果没有达到在3600s,如果有一次写操作就会持久化

        在这里插入图片描述

      • 主从复制时,从节点需要全量同步主节点的数据,会触发 bgsave

      • 执行 debug reload 命令重新加载 redis 时,会触发 bgsave

      • 执行 shutdown 命令时,如果没有开启 aof 持久化,会触发 bgsave

    bgsave子进程工作原理:

    由子进程继承父进程所有资源,且父进程不能拒绝子进程继承,bgsave子进程先将内存中的全量数据copy到磁盘的一个RDB临时文件,持久化完成后将该临时文件替换原来的dump.rdb文件。

    如果持久化过程中出现了新的写请求,则系统会将内存中发生数据修改的物理块copy出一个副本,bgsave 子进程会把这个副本数据写入 RDB 文件,在这个过程中,主线程仍然可以直接修改原来的数据,fork 使用了 写时复制技术(Copy-On-Write)

    操作系统中的写时复制技术:

    目的:是避免不必要的内存拷贝。

    在Linux系统中,调用 fork 系统调用创建子进程时,并不会把父进程所有占用的内存页复制一份,而是与父进程共用相同的内存页,而当子进程或者父进程对内存页进行修改时才会进行复制 —— 这就是著名的 写时复制 机制。

    那么bgsave中的写时复制技术即如果在持久化过程中,写入了新的数据,此时再去将元数据重新拷贝一份,进行修改。

    优点:

    • 使用单独子进程持久化,保证 redis 高性能。
    • RDB 持久化存储压缩的二进制文件,适用于备份、全量复制,可用于灾难备份,同时RDB文件的加载速度远超于AOF文件。

    缺点:

    • 没有实时持久化,可能造成数据丢失。
    • 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(需要的内存是原本的两倍)
    • RDB文件保存的二进制文件存在新老版本不兼容的问题。
  • AOF持久化

    默认AOF没有开启,可在redis.conf中配置

    在这里插入图片描述

    Redis7发生了重大变化,原来只有一个appendonly.aof文件,现在具有了三类多个文件:

    • 基本文件:RDB格式或AOF格式。存放RDB转为AOF当时内存的快照数据。该文件可以有多个。
    • 增量文件:以操作日志形式记录转为AOF后的写入操作。该文件可以有多个。
    • 清单文件:维护AOF文件的创建顺序,保证激活时的应用顺序。该文件只可以有1个。

    aof 文件中存储的 resp 协议数据格式,如果执行命令set a hello,aof文件内容如下:(*3代表有3条命令,$5代表有5个字符)

    *3
    $3
    set
    $1
    a
    $5
    hello
    

    AOF持久化时,其实是先写入缓存中,之后再同步到磁盘中,同步策略有三种:

    • appendfsync always:每次写入都同步到磁盘,最安全,但影响性能。
    • appendfsync everysec(推荐、默认配置):每秒同步一次,最多丢失1秒的数据。
    • appendfsync noRedis并不直接调用文件同步,而是交给操作系统来处理,操作系统可以根据buffer填充情况/通道空闲时间等择机触发同步;这是一种普通的文件操作方式。性能较好,在物理服务器故障时,数据丢失量会因OS配置有关。

    优点:

    • 数据丢失风险较低,后台线程处理持久化,不影响客户端请求处理的线程。

    缺点:

    • 文件体积由于保存的是所有命令会比RDB大上很多,而且数据恢复时也需要重新执行指令,在重启时恢复数据的时间往往会慢很多。

    AOF的重写(Rewrite)机制:

    • 为了防止AOF文件太大占用大量磁盘空间,降低性能,Redis引入了Rewrite机制对AOF文件进行压缩

      Rewrite就是对AOF文件进行重写整理。当开启Rewrite,主进程redis-server创建出一个子进程bgrewriteaof,由该子进程完成rewrite过程。

      首先会对现有aof文件进行重写,将计算结果写到一个临时文件,写入完毕后,再重命名为原aof文件,进行覆盖。

    配置AOF重写频率

    # auto‐aof‐rewrite‐min‐size 64mb //aof文件至少要达到64M才会自动重写,文件太小恢复速度本来就很快,重写的意义不大
    # auto‐aof‐rewrite‐percentage 100 //aof文件自上一次重写后文件大小增长了100%则再次触发重写
    

    AOF的持久化流程图:

在这里插入图片描述

  • 混合持久化开启

    默认开启,即AOF持久化的基本文件时的基本文件是RDB格式的。(必须先开启aof)

    在这里插入图片描述

    混合持久化重写aof文件流程:aof 在重写时,不再将内存数据转为 resp 数据写入 aof 文件,而是将之前的内存数据做 RDB 快照处理,将 RDB快照+AOF增量数据 存在一起写入新的 AOF 文件,完成后覆盖原有的 AOF 文件。

    Redis重启加载数据流程:

    1. 先加载 RDB 数据到内存中
    2. 再重放增量 AOF 日志,加载 AOF 增量数据

    优点:

    • 结合了 RDB 和 AOF,既保证了重启 Redis 的性能,又降低数据丢失风险

    缺点:

    • AOF 文件中添加了 RDB 格式的内容,使得 AOF 文件的可读性变得很差;

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

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

相关文章

反编译-ApkTool

ApkTool下载地址: Apktool | ApktoolA tool for reverse engineering Android apk fileshttps://apktool.org/ 1、使用 apktool 解包 执行 java -jar apktool_2.4.1.jar d demo.apk -o demo 命令 java -jar apktool_2.4.1.jar d demo.apk -o demo 其中 d 后面是…

嵌入式基础知识学习:Flash、EEPROM、RAM、ROM

https://blog.csdn.net/y673533511/article/details/87913989 FLASH存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦出可编程(EEPROM) 的性能,还不会断电丢失数据同时可以快速读取数据 (NVRAM 的优势),U 盘和MP3 里用的…

JSP:Javabean

起初,JavaBean的目的是为了将可以重复使用的代码进行打包,在传统的应用中,JavaBean主要用于实现一些可视化界面,如一个窗体、按钮、文本框等,这样的JavaBean称之可视化的JavaBean。 随着技术的不断发展与项目的需求&am…

MySQL 事务的底层原理和 MVCC(一)

在事务的实现机制上,MySQL 采用的是 WAL(Write-ahead logging,预写式日志)机制来实现的。 在使用 WAL 的系统中,所有的修改都先被写入到日志中,然后再被应用到系统中。通常包含 redo 和 undo 两部分信息。 …

react大文件上传

目录 大文件上传优点: 大文件上传缺点: 大文件上传原理: 为什么要用md5 实现流程: 部分代码1: 部分代码2:​ 大文件上传优点: 文件太大分片上传能加快上传速度,提高用户体验能断点续传 如果上次上传失败…

纳米软件电源芯片测试案例分享:测试方案、仪器选型、解决测试难点

一、背景介绍 成都某半导体芯片公司是一家专注于开发设计半导体电源芯片的高新技术企业,目前企业对于电源管理芯片研发阶段的测试,绝大部分采用人工手动测试,效率低,耗时长,数据管理储存难度大,无法快速地完…

依托数据、平台、知识增强等优势 夸克大模型大幅降低问答幻觉率

“大模型时代,夸克有巨大机会创造出革新性搜索产品。”11月22日,夸克大模型公布了其面向搜索、生产力工具和资产管理助手的大模型技术布局。数据显示,夸克千亿级参数大模型登顶C-Eval和CMMLU两大权威榜单,夸克百亿级参数大模型同样…

SpringMVC问题

文章目录 SpringMVC运行流程MVC的概念与请求在MVC中的执行路径,ResponsBody注解的用途SpringMVC启动流程 SpringMVC运行流程 • 客户端(浏览器)发送请求,直接请求到 DispatcherServlet 。 • DispatcherServlet 根据请求信息调用 …

minio安装使用-linux

下载地址:MinIO | Code and downloads to create high performance object storage 选择 minio server 可以直接下载二进制文件。 将下载的文件传输到服务器的指定文件夹下,如 /opt/minio。 然后在,命令行启动minio: /opt/mini…

【Python】重磅!这本30w人都在看的Python数据分析畅销书更新了!

Python 语言极具吸引力。自从 1991 年诞生以来,Python 如今已经成为最受欢迎的解释型编程语言。 【文末送书】今天推荐一本Python领域优质数据分析书籍,这本30w人都在看的书,值得入手。 目录 作译者简介主要变动导读视频购书链接文末送书 pan…

常见面试题-Redis 主从复制原理以及痛点

Redis 主从复制如何同步数据呢? 参考文章:https://blog.csdn.net/Seky_fei/article/details/106877329 https://zhuanlan.zhihu.com/p/55532249 https://cloud.tencent.com/developer/article/2063597 https://xie.infoq.cn/article/4cffee02a2a12c2…

【Linux】-进程间通信-共享内存(SystemV),详解接口函数以及原理(使用管道处理同步互斥机制)

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

Nuxt3使用

1.官网下载 npx nuxilatest init nuxt(有墙)&#xff0c;也可以到这个地方下载&#xff1a;git clone https://gitee.com/pmx600/nuxt3.git。 2.找到app.vue文件 将里面的代码修改为&#xff1a;<template><NuxtPage /></template>&#xff0c;NuxtPage 的…

【JavaScript】2.3 数据处理和函数式编程

文章目录 数组操作mapfilterreduce 函数式编程纯函数高阶函数闭包 总结 JavaScript提供了丰富的数据处理方法&#xff0c;特别是在数组操作和函数式编程方面。在这一章节中&#xff0c;我们将学习一些JavaScript中的数据处理技巧和函数式编程的基本概念。 数组操作 JavaScript…

替换的DLL用户电脑报错加载失败

编译后混淆加签名的dll 远程下载下来有个选项&#xff1a; 在某用户电脑上出现加载失败的报错 右键dll 属性里勾选解除锁定后 加载运行正常 跟用户电脑安全策略有关系 有的会出现 大部分不会

函数式编程-Stream流笔记-三更草堂

函数式编程-Stream流 1. 概述 1.1 为什么学&#xff1f; 能够看懂公司里的代码 大数量下处理集合效率高 代码可读性高 消灭嵌套地狱 //查询未成年作家的评分在70以上的书籍 由于数据中作家和书籍可能出现重复&#xff0c;需要进行去重 List<Book> bookList new Ar…

有用!2023汉字小达人市级比赛填空题专项训练,在线模拟题来了

只剩下一周了&#xff0c;2023年第十届汉字小达人市级比赛就要正式开始了。 敲黑板&#xff01;汉字小达人区级比赛时间为2023年11月30日&#xff08;星期四&#xff09;下午16&#xff1a;00-18&#xff1a;00&#xff0c;记得设置闹钟。提前和老师确认学校统一组织比赛&…

uni-app 使用uni.getLocation获取经纬度配合腾讯地图api获取当前地址

前言 最近在开发中需要根据经纬度获取当前位置信息&#xff0c;传递给后端&#xff0c;用来回显显示当前位置 查阅uni-app文档&#xff0c;发现uni.getLocation () 可以获取到经纬度&#xff0c;但是在小程序环境没有地址信息 思考怎么把经纬度换成地址&#xff0c;如果经纬度…

d3dx9_43.dll缺失怎么办?教你一分钟修复d3dx9_43.dll丢失问题

今天&#xff0c;与大家分享关于“d3dx9_43.dll丢失的5个解决方法”的主题。在我们的日常生活和工作中&#xff0c;我们可能会遇到各种各样的问题&#xff0c;而d3dx9_43.dll丢失就是其中之一。那么&#xff0c;什么是d3dx9_43.dll呢&#xff1f;它为什么会丢失&#xff1f;又该…

pikachu靶场PHP反序列化漏洞

pikachu靶场PHP反序列化漏洞 源码分析 查看源代码 class S{var $test "pikachu";function __construct(){echo $this->test;} }// O:1:"S":1:{s:4:"test";s:29:"<script>alert(xss)</script>";} $html; if(isset($_PO…