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

谈谈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 文件的可读性变得很差;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:顺序表

目录 一.顺序表 1.1概念以及结构 1.2动态顺序表实现 1.2.1文件创建: 1.2.2接口实现 1.顺序表打印 2.顺序表初始化 3.顺序表尾插 4.顺序表头插 5.顺序表尾删 6.顺序表头删 7.顺序表在pos位置插入x 8.顺序表删除pos位置的值 9.顺序表销毁 二.顺序表问题 一.…

关于 Docker

关于 Docker 1. 术语Docker Enginedockerd(Docker daemon)containerdOCI (Open Container Initiative)runcDocker shimCRI (Container Runtime Interface)CRI-O 2. 容器启动过程在 Linux 中的实现daemon 的作用 Docker 是个划时代的开源项目,…

「快学Docker」监控和日志记录容器的健康和性能

「快学Docker」监控和日志记录容器的健康和性能 1. 容器健康状态监控2. 性能监控3. 日志记录几种采集架构图 4. 监控工具和平台cAdvisor(Container Advisor)PrometheusGrafana 5. 自动化运维 1. 容器健康状态监控 方法1:需要实时监测容器的运…

在iPad pro上安装VSCode,秒变生产力工具提升编程工作效率!

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、Cpolar杂谈 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. 本地环境配置二. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.…

智慧法院档案数字化解决方案

智慧法院档案数字化解决方案可以采用以下步骤: 1. 确定数字化目标:明确数字化的目标和范围,比如将所有的案件相关文件、纸质档案和材料进行数字化。 2. 确定数字化流程:制定数字化的流程和标准,比如采用哪些设备和软件…

人工智能基础_机器学习047_用逻辑回归实现二分类以上的多分类_手写代码实现逻辑回归OVR概率计算---人工智能工作笔记0087

然后我们再来看一下如何我们自己使用代码实现逻辑回归的,对二分类以上,比如三分类的概率计算 我们还是使用莺尾花数据 首先我们把公式写出来 def sigmoid(z): 定义出来这个函数 可以看看到这需要我们理解OVR是如何进行多分类的,我们先来看这个 OVR分类器 思想 OVR(One-vs-…

Android设计模式--模板方法模式

一,定义 定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 在面向对象的开发过程中,通常会遇到这样一个问题,我们知道一个算法所需的关键步…

2023年【上海市安全员C证】考试及上海市安全员C证找解析

题库来源:安全生产模拟考试一点通公众号小程序 2023年上海市安全员C证考试为正在备考上海市安全员C证操作证的学员准备的理论考试专题,每个月更新的上海市安全员C证找解析祝您顺利通过上海市安全员C证考试。 1、【多选题】2017年9月颁发的《中共上海市委…

达索系统SOLIDWORKS流体分析网格划分失败,大多是这2种原因

SOLIDWORKS Flow Simulation 是直观的流体力学 (CFD) 分析软件,该软件功能强大、操作人性化,快速轻松的分析产品内部或外部流体的流动情况,以用来改善产品性能和功能。 当流体分析运行网格划分时,提示失败。 这是由于凸起面与圆…

HTML新手入门笔记整理:HTML基本介绍

网页 静态页面 仅可供用户浏览,不具备与服务器交互的功能。 动态页面 可供用户浏览,具备与服务器交互的功能。 HTML HTML,全称HyperText Markup Language(超文本标记语言),是一种用于创建网页的标准标记语言。用于…

基于向量加权平均算法优化概率神经网络PNN的分类预测 - 附代码

基于向量加权平均算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于向量加权平均算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于向量加权平均优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xf…

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

7.2. undo 日志 7.2.1. 事务回滚的需求 我们说过事务需要保证原子性,也就是事务中的操作要么全部完成,要么什么也不做。但是偏偏有时候事务执行到一半会出现一些情况,比如: 情况一:事务执行过程中可能遇到各种错误&a…

C语言--数组与指针--打印字符串的n种方式

一.知识背景 一维数组名的含义 arr一般表示数组的起始地址(除了两种例外) 1.在定义数组的同一个函数中(不是形参),求sizeof(arr),求整个数组的字节数 2.在定义数组的同一个函数中(不是形参),&arr1,加整个数组的大小 (经常考试) 3.除上面以外,arr都表…

io+day5

1&#xff0c;select服务端 1 #include<myhead.h>2 3 #define PORT 8888 //端口号4 #define IP "192.168.228.165" //IP地址5 6 7 int main(int argc, const char *argv[])8 {9 //1、创建用于接受连接的套接字10 int sfd socket(…

使用低代码可视化开发平台快速搭建应用

目录 一、JNPF可视化平台介绍 二、搭建JNPF可视化平台 【表单设计】 【报表设计】 【流程设计】 【代码生成器】 三、使用JNPF可视化平台 1.前后端分离&#xff1a; 2.多数据源&#xff1a; 3.预置功能&#xff1a; 4.私有化部署&#xff1a; 四、总结 可视化低代码…

java_函数式接口

文章目录 一、什么是函数式接口二、四大核心函数式接口三、使用举例 一、什么是函数式接口 如果一个接口只有一个抽象方法&#xff0c;那么该接口就是一个函数式接口函数式接口的实例可以通过 lambda 表达式、方法引用或者构造方法引用来创建如果我们在某个接口上声明了 Funct…

每日一题:LeetCode-589.N叉树的前序遍历

每日一题系列&#xff08;day 01&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

Spring Boot创建和使用(重要)

Spring的诞生是为了简化Java程序开发的&#xff01; Spring Boot的诞生是为了简化Spring程序开发的&#xff01; Spring Boot就是Spring框架的脚手架&#xff0c;为了快速开发Spring框架而诞生的&#xff01;&#xff01; Spring Boot的优点&#xff1a; 快速集成框架&#x…

三维控件中定位一个点_vtkPointWidget

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码 demo解决问题&#xff1a;允许用户使用三维光标在三维空间中定位一个点。关键类vtkPointWidget , 光标具有轮廓边界框、轴对齐十字准线和轴阴影&#xff…

【C++】vector的介绍与使用

&#x1f9d1;‍&#x1f393;个人主页&#xff1a;简 料 &#x1f3c6;所属专栏&#xff1a;C &#x1f3c6;个人社区&#xff1a;越努力越幸运社区 &#x1f3c6;简 介&#xff1a;简料简料&#xff0c;简单有料~在校大学生一枚&#xff0c;专注C/C/GO的干货分…