【面试八股总结】Redis持久化

        Redis 实现了数据持久化的机制,这个机制会把数据存储到磁盘,这样在 Redis 重启就能够从磁盘中恢复原有的数据。 Redis 共有三种数据持久化的⽅式:

  • AOF 日志:每执行一条写操作命令,就把该命令以追加的方式写入到⼀个文件里;
  • RDB 快照:将某一时刻的内存数据,以二进制的方式写入磁盘;
  • 混合持久化方式:Redis 4.0 新增的方式,集成了 AOF 和 RBD 的优点。

一、AOF日志

        AOF以日志的形式记录服务器所处理的每一个写操作,Redis服务器启动之初,会读取该日志来重新构建数据库,以保证启动后的数据库是完整的。

注意:AOF只会记录写操作命令,读操作命令是不会被记录的。

        AOF日志是写后日志,"写后" 的意思是 Redis 是先执行命令,把数据写入内存,然后才记录日志。Redis是内存和日志(写后日志),MySQL是磁盘数据和日志(写前日志)。

写后日志过程

Redis 使用写后日志这一方式的好处:

  1. 可以避免出现记录错误命令的情况。
  2. 它是在命令执行后才记录日志,所以不会阻塞当前的写操作。

1. 写入 AOF 日志过程

Redis 写入 AOF 日志过程:

  1. Redis 执行完写操作命令后,会将命令追加到 server.aof_buf缓冲区;
  2. 通过write()系统调用,将aof_buf缓冲区的数据写入到AOF文件,此时数据并没有写入硬盘,而是拷贝到内核缓冲区page cache,等待内核将数据写入硬盘;
  3. 由内核决定缓冲区数据什么时候写入硬盘。
Redis 写入 AOF 日志过程

2. AOF写回策略

Redis 提供了 3 种写回硬盘的策略:Always、No、Everysec

  • Always是每次写操作命令执行完后,同步将 AOF 日志数据写回硬盘;
  • Everysec每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,然后每隔⼀秒将缓冲区里的内容写回到硬盘;
  • No就是不控制写回硬盘的时机。每次写操作命令执行完后,先将命令写入到 AOF ⽂件的内核缓冲区,再由操作系统决定何时将缓冲区内容写回硬盘;

写回策略选择:

  • 想要获得高性能,就选择 No 策略
  • 如果想要得到高可靠性保证,就选择 Always 策略
  • 如果允许数据有一点丢失,又希望性能别受太大影响的话,那么就选择 Everysec 策略

3. AOF磁盘重写机制

        AOF 日志是一个文件,随着执行的写操作命令越来越多,文件的大小会越来越大。为避免日志文件过大,Redis 提供AOF重写机制,它会直接扫描数据中所有的键值对数据,然后为每⼀个键值对生成⼀条写操作命令,接着将该命令写入到新的 AOF 文件,重写完成后,就替换掉现有的 AOF日志

        重写的过程是由后台子 bgrewriteaof 进程完成的,这样可以使得主进程可以继续正常处理命令。在重写 AOF 期间,当 Redis 执行完一个写命令之后,它会同时将这个写命令写入到 「AOF 缓冲区」和 「AOF 重写缓冲区」。

        在 bgrewriteaof 子进程执行 AOF 重写期间,主进程需要执行以下三个工作:

  • 执行客户端发来的命令;
  • 将执行后的写命令追加到 「AOF 缓冲区」;
  • 将执行后的写命令追加到 「AOF 重写缓冲区」;

        当子进程完成 AOF 重写工作,向主进程发送信号,主进程收到信号后,调用信号处理函数,将AOF重写缓冲区中所有内容追加到新的AOF文件中,并将新的AOF文件改名,覆盖原有AOF文件。

二、RDB快照

        RDB 快照就是记录某一个瞬间的内存数据,记录的是实际数据。每次执行快照,都是把内存中的「所有数据」都记录到磁盘中。如果频率太频繁,可能会对 Redis 性能产生影响。如果频率太低,服务器故障时,丢失的数据会更多。通常可能设置至少5 分钟才保存⼀次快照。

        Redis 提供了两个命令来生成 RDB 文件,save 和 bgsave,区别在于是否在主线程中执行:

  • save 命令在主线程生成 RDB 文件,由于和执行操作命令在同⼀个线程,所以如果写⼊入RDB 文件的时间太长,会阻塞主线程;
  • bgsave 命令,会创建⼀个子进程来生成 RDB 文件,这样可以避免主线程的阻塞。

Redis 的快照是全量快照,也就是说每次执行快照,都是把内存中的「所有数据」都记录到磁盘中。

三、混合持久化

          开启混合持久化功能,可以在 Redis 配置文件将下面这个配置项设置成 yes:

aof-use-rdb-preamble yes

        混合持久化工作在 AOF 日志重写过程。当开启了混合持久化时,在 AOF 重写日志时,fork出来的重写子进程会先将与主线程共享的内存数据以 RDB 方式写入到 AOF 文件,然后主线程处理的操作命令会被记录在重写缓冲区里,重写缓冲区里的增量命令会以 AOF 方式写入到 AOF 文件,写入完成后通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的的 AOF 文件。文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据。

        这样的好处在于,重启 Redis 加载数据的时候,由于前半部分是 RDB 内容,这样加载的时候速度会很快。加载完 RDB 的内容后,才会加载后半部分的 AOF 内容,这⾥的内容是 Redis 后台⼦进程重写 AOF 期间,主线程处理的操作命令,可以使得数据更少的丢失。

        混合持久化的缺点是AOF文件的可读性变差了,以及兼容性比较差(Redis4.0之前版本不支持)。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络】HTTP相关问题与解答

此篇文章内容会不定期更新,仅作为学习过程中的笔记记录 目录 一、HTTP请求和响应报文是怎样的? 1、请求报文 2、响应报文 二、HTTP请求方法有哪些? GET HEAD POST PUT DELETE PATCH OPTIONS TRACE CONNECT 三、GET请求与POST请…

菜单、工具栏 的基本使用

效果 代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QToolBar> #include<QDebug> #include<QPushButton>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupU…

将一个字符串以三个字符为间隔分别放在三个字符串数组里

要求 请编写函数fun&#xff0c;其功能是:编写函数char *fun(char*s0,char *s1,char *s2,char*s3)&#xff0c; 要求实现: 将s0所指字符串分解成三个字符串&#xff0c;分别存入s1、s2、s3所指内存中。分解的方法是&#xff0c;s1、s2、53从s0中依次顺序每隔3个字符取1例如:s0…

OpenCV 4.10 windows 上编译并上传conan

目录 一. 上传opencv 预编译包 二. 自己手动写一个测试包并上传 三. 自己写一个app, 引用包 一. 上传opencv 预编译包 1. 下载Opencv, 并用cmake 打开 打开工程之后&#xff0c;编译&#xff0c;install&#xff0c; 目录如下 2. 准备conan 包 把Debug 和 Release 分开放 3…

CleanClip for Mac 剪切板 粘贴工具 历史记录 安装(保姆级教程,新手小白轻松上手)

CleanClip&#xff1a;革新macOS剪贴板管理体验 目录 功能概览 多格式历史记录保存智能搜索功能快速复制操作拖拽功能 安装指南 前期准备安装步骤 配置与使用 功能概览 多格式历史记录保存 CleanClip支持保存文本、图片、文件等多种格式的复制历史记录&#xff0c;为用户提…

【应用笔记】Cot Menu 轻量级多级菜单控制框架程序(C语言)

【应用笔记】Cot Menu 轻量级多级菜单控制框架程序&#xff08;C语言&#xff09; 前言: 工作需要, 实现一个串口打印的类shell菜单. 如果按照以往的习惯我会自己重新"构思"(狗屎)一个菜单框架.之前用oled和lcd时,我都从零重复造轮子. 作为一个成熟的程序员, 应该要学…

【机器学习(二)】分类和回归任务-决策树算法-Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理&#xff08;一&#xff09;树的构造&#xff08;二&#xff09;划分选择1、信息增益2、基尼指数3、卡方检验 &#xff08;三&#xff09;停止标准&#xff08;四&#xff09;剪枝处理1、预剪枝2、后剪枝 三、决策树的优缺点四、决策树分类任…

ai扩图使用什么软件?无损扩图用这5个

你们知道ai扩图是什么吗&#xff1f;其实就是利用人工智能技术对图片进行无损放大处理&#xff0c;让低分辨率的图片变得清晰。通常在图像处理、设计和摄影领域尤为实用。 那么&#xff0c;你们知道ai扩图在线工具怎么选吗&#xff1f;别急&#xff0c;下面这篇文章分享5个超好…

11Python的Pandas:可视化

Pandas本身并没有直接的可视化功能&#xff0c;但它与其他Python库&#xff08;如Matplotlib和Seaborn&#xff09;无缝集成&#xff0c;允许你快速创建各种图表和可视化。这里是一些使用Pandas数据进行可视化的常见方法&#xff1a; 1. 使用Matplotlib Pandas中的plot()方法…

品读 Java 经典巨著《Effective Java》90条编程法则,第4条:通过私有构造器强化不可实例化的能力

文章目录 【前言】欢迎订阅【品读《Effective Java》】系列专栏java.lang.Math 类的设计经验总结 【前言】欢迎订阅【品读《Effective Java》】系列专栏 《Effective Java》是 Java 开发领域的经典著作&#xff0c;作者 Joshua Bloch 以丰富的经验和深入的知识&#xff0c;全面…

【软件文档】软件系统应急处理方案(word原件)

1 总则   1.1 目的 1.2 工作原则   2 应急工作小组机构及职责 3 预警和预防机制 3.1 系统监测及报告   3.2 预警 3.3 预警支持系统 3.4 预防机制 4 应急处理程序 4.1 系统突发事件分类分级的说明 4.2 系统应急预案启动 4.3 现场应急处理 5 保障措施   5.1 应急演练 5.2…

时间复杂度计算 递归

我们先拿出 2021 csp-s 程序题中一道看着就头大的程序题&#xff0c;要求分析 solve1 的复杂度。 设 T(n) ⁡ \operatorname{T(n)} T(n) 表示数组长度为 n n n 时的复杂度&#xff08;即 m − h 1 n m-h1n m−h1n&#xff09;。 T ( 1 ) 1 T(1)1 T(1)1&#xff0c;根据…

R语言机器学习算法实战系列(一):XGBoost算法(eXtreme Gradient Boosting)

介绍 XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升决策树(GBDT)的优化算法,它在处理大规模数据集和复杂模型时表现出色,同时在防止过拟合和提高泛化能力方面也有很好的表现。以下是XGBoost算法的原理和应用方向的详细介绍: 算法原理 目标函数:XGBoost的目标…

华为ensp中vlan与静态路由技术的实现

vlan 同一网段的设备&#xff0c;可以互通&#xff1b; 虚拟局域网&#xff1a;将局域网从逻辑上划分为多个局域网&#xff0c;不同通过vlan编号区分&#xff1b; 实现网络隔离。提高了网络安全性&#xff1b; vlan编号为12位&#xff1b; 范围1-4094可以用来配置 默认处于…

pytorch-AutoEncoders实战

目录 1. AutoEncoders回顾2. 实现网络结构3. 实现main函数 1. AutoEncoders回顾 如下图&#xff1a;AutoEncoders实际上就是重建自己的过程 2. 实现网络结构 创建类继承自nn.Model&#xff0c;并实现init和forward函数&#xff0c;init中实现encoder、decoder 直接上代码&a…

代码随想录算法训练营第13天|二叉树基础知识、递归遍历、迭代遍历、层序遍历、116. 填充每个节点的下一个右侧节点指针

目录 二叉树基础深度和高度满二叉树和完全二叉树二叉搜索树和平衡二叉搜索树二叉树节点定义前中后序遍历 递归遍历前序递归遍历—144. 二叉树的前序遍历 迭代遍历层序遍历116. 填充每个节点的下一个右侧节点指针1、题目描述2、思路3、code 二叉树基础 深度和高度 满二叉树和完…

XSS跨站脚本攻击及防护

什么是XSS攻击&#xff1f; XSS(Cross-Site Scripting,跨站脚本攻击)是一种代码注入攻击。攻击者在目标网站上注入恶意代码&#xff0c;当用户(被攻击者)登录网站时就会执行这些恶意代码&#xff0c;通过这些脚本可以读取cookie,session tokens&#xff0c;或者网站其他敏感的网…

Ubuntu WSL使用技巧

0 Preface/Foreword 1 默认为root用户 当下载完成Ubuntu之后&#xff0c;首次登录&#xff0c;当完成初始化后&#xff0c;提示输入新的用户名时候&#xff0c;直接点击右上角的X按钮&#xff0c;再重新登陆&#xff0c;系统会默认使用root权限登录。 2 root用户和普通用户切换…

阿里云社区领积分自动打卡Selenium IDE脚本

脚本 感觉打卡比较麻烦&#xff0c;要点开点按钮这种机械化的操作。 所以就自己整了个脚本&#xff1a; { “id”: “f9999777-9ad6-40e0-9435-4f105919c982”, “version”: “2.0”, “name”: “aliyun”, “url”: “https://developer.aliyun.com”, “tests”: [{ “id”…

ubuntu22安装docker

1、查看服务器系统信息 uname -a&#xff1a;显示内核名称、主机名、内核版本、处理器类型等信息。 lsb_release -a&#xff1a;显示有关 Ubuntu 发行版的详细信息&#xff0c;包括版本号、代号等。 free -h&#xff1a;查看系统内存使用情况。 df -h&#xff1a;查看磁盘空间使…