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

2023.1.17 关于 Redis 持久化 AOF 策略详解

目录

引言

AOF 策略

实例演示一

缓冲区

重写机制

手动触发

自动触发

AOF 重写流程 

实例演示二


引言

Redis 实现持久化的两大策略

  • RDB ——> Redis DataBase(定期备份)
  • AOF ——> Append Only File(实时备份)

注意:

  • Redis 服务器配置文件默认开启 RDB(定期备份)
  • 即 AOF(实时备份) 默认为关闭状态
  • 此处我们可以通过修改配置文件,来开启 AOF(实时备份)


可点击下方连接详细了解 RDB 策略

Redis 持久化 RDB 策略

AOF 策略

  • 该策略类似于 mysql 的 binlog,会将用户的每个操作均记录到文件中
  • 当 Redis 重新启动时,便会读取 aof 文件中的内容,将内存中的数据恢复回来

注意:

  • 当开启 AOF 时,rdb 文件便不会生效了
  • 即 Redis 启动时将不再读取 rdb 文件的内容用来恢复数据
  • 因为 aof 文件中包含的数据比 rdb 文件更全!

实例演示一

  • 根据实例演示,我们观察 aof 文件的生成,顺便观察 rdb 文件在 AOF 策略下的 Redis 是否生效

 1、当我们将 Redis 配置文件中的 RDB(定期备份)修改为 AOF(实时备份)后

  • 由上图可知,即便是没有 rdb 文件,Redis 服务器也可正常重启!

2、此时我们向 redis 中插入 2个键值对


3、查看 appendonly.aof 文件

  • 由上图可知,aof 文件为文本文件
  • 我们在 Redis 中进行的操作,均会被记录到 aof 文件中
  • 通过一些特殊符号作为分隔符,来对命令的细节做出区别

4、将现在正在运行的 Redis 服务器重启,看是否能恢复内存之前的状态

缓冲区

  • Redis 虽然是一个单线程的服务器,但是速度很快
  • 其中一个重要的原因为 Redis 仅操作内存

问题一:

  • 引入 AOF(实时备份)后,既要写内存,又要写硬盘,还能和之前一样快吗?

回答:

  • 没有什么影响,并不会影响到 Redis 处理请求的速度!

1、AOF 机制并非是直接让工作线程将数据写入硬盘,而是先写入内存中的缓冲区,积累一波后,再统一写入硬盘

  • 该方式大大降低了,写硬盘的次数
  • 写硬盘时,写入硬盘数据的多少,对于性能没有很大影响但是写入硬盘的次数则影响很大了

2、AOF 机制每次将新操作写入到原有文件的末尾,属于 顺序写入

  • 硬盘上读写数据,顺序读写的速度是比较快的(还是要比内存慢很多),而随机访问的速度则是比较慢的

问题二:

  • 数据写入到缓冲区里,其本质还是在内存中呀
  • 万一这时候,突然进程挂了 或 主机掉电了,是不是缓冲区中的数据就丢了呢?

回答:

  • 是的,缓冲区没来得及写入硬盘的数据是会丢的!
  • Redis 给出了一些选项,让程序员根据实际情况决定怎么取舍,即缓冲区的刷新策略
  • 刷新频率越高,性能影响就越大,数据可靠性就越高
  • 刷新频率越低,性能影响就越小,数据可靠性就越低

  • fsync 是一个系统调用,用于强制将文件系统中对应文件的所有修改刷新到磁盘上

注意:

  • 默认情况下为 everysec

重写机制

  • aof 文件持续增长,其体积将越来越大,从而影响 Redis 下次启动的启动时间
  • 因为 Reids 启动的时候要读取 aof 文件的内容

注意:

  •  aof 中的文件,有很多内容都是冗余的

  • 虽然 aof 文件的内容记录了中间的操作过程
  • 但实际 Redis 在重新启动时,仅关注最终的结果
  • 因此 Redis 存在 重写机制,能够针对 aof 文件进行 整理 操作
  • 所谓 整理 就是能够剔除其中的冗余操作,并且合并一些操作,以达到 aof 文件瘦身的效果

手动触发

  • 调用 bgrewriteaof 命令即可

自动触发

  • 根据配置项参数确定自动触发时机

  • auto-aof-rewrite-min-size: 表示触发重写时 aof 文件的最小文件大小
  • auto-aof-rewrite-percentage: 表示当前 aof 文件占用大小相比较上次重写时增加的比例

AOF 重写流程 


2)4)

  • 发生重写时,通过 fork 创建子进程
  • 在创建子进程的一瞬间,子进程便继承了当前父进程的内存状态
  • 子进程只需要将内存中当前的数据给获取出来,以 aof 的格式写入到一个新的 aof 文件中
  • 与此同时 子进程负责针对 aof 文件进行重写

注意点一:

  • 子进程里的内存数据是 父进程 fork 之前的状态
  • 而 fork 之后,对内存造成修改的新请求,子进程无法知道的!

注意点二:

  • 在此过程中并不关心 aof 文件中原来都有啥,仅关心内存中最终的数据状态
  • 内存中的数据状态,就已经相当于是把 aof 文件结果整理后的模样了

注意点三:

  • 此处 子进程 写数据的过程,非常类似于 RDB 生成一个镜像快照
  • 只不过 RDB 这里是按照二进制的方式来生成的
  • 而 AOF 重写,则是按照 AOF 这里要求的文本格式来生成的
  • 二者 都是为了把当前内存中的所有数据状态记录到文件中


1)2)3.1)

  • 在子进程写新 aof 文件的同时,父进程也仍然不停地接收客户端新请求
  • 并将这些请求产生的 aof 数据先写入到缓冲区再刷新到原有的 aof 文件中

2)3.2)

  • 正因为子进程里的内存数据是 父进程 fork 之前的状态
  • 而 fork 之后,对内存造成修改的新请求,子进程无法知道的!
  • 此时父进程这里便准备了一个 aof_rewrite_buf 缓冲区
  • 专门放 fork 之后收到的数据

5.1)5.2)

  • 子进程将 aof 数据写完后,便会通过 信号 通知父进程
  • 父进程再将 aof_rewrite_buf 缓冲区中的内容也写入到 新的 aof 文件中

注意:

  • 信号可以认为是 linux 的神经系统
  • 进程之间的相互作用(也可以视为是进程间通信的一种手段)
  • 但 Java 生态中并不鼓励适用多进程模型编程(网络通信的场景除外)
  • 信号能表达的信息有限,并非像 socket 这样的方式可以传输任意的数据
  • 这种简单的信号传递,使用信号也是 ok 的
  • 信号 接近于 JavaScript 里的 事件


5.3)

  • 最后便可以使用新 aof 文件替换旧 aof 文件了

问题一:

  • 如果在执行 bgrewriteaof 时,当前 Redis 正在进行 aof 重写,此时会怎样?

回答:

  • 此时将不会再次执行 aof 重写,而是直接返回

问题二:

  • 如果在执行 bgrewriteaof 时,发现当前 Redis 在生成 rdb 文件的快照,此时会怎样?

回答:

  • 此时 aof 重写操作便会等待,等待 rdb 快照生成完毕之后,再执行 aof 重写

问题三:

  • 在父进程 fork 完毕后,子进程开始重写新 aof 文件
  • 并且随着时间的推移,子进程将会很快写完新 aof 文件
  • 最后 新 aof 文件将代替旧 aof 文件
  • 那么 父进程此时还在继续写这个即将消亡的旧 aof 文件是否还有意义?

回答:

  • 考虑到极端情况
  • 假设在重写过程中,重写了一半,服务器挂了,子进程内存的数据就会丢失,此时新 aof 文件内容还不完整
  • 所以如果 父进程不坚持写旧 aof 文件,重启时便无法保证数据的完整性了

小总结:

  • RDB 对 fork 之后的新数据,便置之不理了
  • 而 AOF 则对 fork 之后的新数据,采取了 aof_rewrite_buf 缓冲区的方式来进行处理
  • RDB 本身的设计理念,就是用来 定期备份的
  • 只要是 定期备份,就难以和最新的数据保持一致
  • AOF 的理念则是实时备份
  • 当然 实时备份 并不一定就比 定期备份 更好,还是需要结合 实际场景 来看
  • 现在的系统,其资源一般都是比较充裕的,即 对于 AOF 所造成的开销也不会有太大负担
  • 所以 一般来说 AOF 的适用场景更多一些的!

实例演示二

  • 通过该实例演示 观察重写之后的 aof 文件

1、向 Redis 中进行下图操作


2、打开并查看  appendonly.aof 文件


3、在 Redis 中手动执行 bgrewriteaof 命令,手动触发 AOF 重启


4、再次观察 appendonly.aof 文件

  • 此时发现 数据居然以二进制的方式进行存储

注意:

  • AOF 本来是按照文本格式来写入文件的
  • 但是文本的方式写文件,后续加载的成本是比较高的
  • 所以 Redis 便引入了 混合持久化 的方式,即结合了 rdb 和 aof 的特点

具体解释:

  • 按照 AOF 的方式,将每个 请求 或 操作,均记录到文件中
  • 在触发 AOF 重写后,便将当前内存的状态按照 rdb 的二进制格式写入到新 aof 文件中
  • 后续再进行的操作,仍然按照 aof 文本的方式追加到文件后面


5、我们再往 Redis 中插入 1个键值对


6、再次打开并观察 appendonly.aof 文件

相关文章:

2023.1.17 关于 Redis 持久化 AOF 策略详解

目录 引言 AOF 策略 实例演示一 缓冲区 重写机制 手动触发 自动触发 AOF 重写流程 实例演示二 引言 Redis 实现持久化的两大策略 RDB ——> Redis DataBase(定期备份)AOF ——> Append Only File(实时备份) 注意&…...

P2PNet推理和训练

0、环境信息 Package Version ------------------------ ------------ certifi 2023.11.17 charset-normalizer 3.3.2 contourpy 1.2.0 cycler 0.12.1 easydict 1.11 filelock …...

pyexecjs原生js加密算法逆向

查看必要参数,得知sign签名 从堆栈自上到下依次查找源代码 如下图,找到后打上断点,得知e是输入的参数,说明b()是一个加密函数,点击进入查看底层函数 把1117这个函数内的三个方法CV到python中的一个js文件中&#xff0c…...

数据结构Java版(4)——链表

一、概述 链表是一种常见的数据结构,用于存储一系列具有相同类型的数据元素。它由多个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。 链表与数组不同,它的节点在内存中不是连续存储的,而是通过每个节点中的指针…...

cfssl简单使用

1、安装 方式1:直接下载 详见:手动生成证书 | Kubernetes # 1、下载cfssl、cfssljson、cfssl-certinfo # cfssl:用于签发证书 # cfssljson:将cfssl签发生成的证书(json格式)变成文件承载式文件 # cfssl-certinfo:验…...

基于Word2vec词聚类的关键词实现

一.基于Word2vec词聚类的关键词步骤 基于Word2Vec的词聚类关键词提取包括以下步骤: 1.准备文本数据:收集或准备文本数据,可以是单一文档或文档集合,涵盖关键词提取的领域。2.文本预处理:清洗文本数据,去除…...

开源项目_大模型应用_Chat2DB

1 基本信息 项目地址:https://github.com/chat2db/Chat2DBStar:10.7K 2 功能 Chat2DB 是一个智能且多功能的 SQL 客户端和报表工具,适用于各种数据库。 对于那些平时会用到数据库,但又不是数据库专家的程序员来说,…...

【线性代数与矩阵论】范数理论

范数理论 2023年11月16日 文章目录 范数理论1. 向量的范数2. 常用向量范数3. 向量范数的等价性4. 矩阵的范数5. 常用的矩阵范数6. 矩阵范数与向量范数的相容性7. 矩阵范数诱导的向量范数8. 由向量范数诱导的矩阵范数9. 矩阵范数的酉不变性10. 矩阵范数的等价性11. 长方阵的范数…...

【C++】priority_queue模拟实现过程中值得注意的点

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 前言 本篇文章旨在记录博主在模…...

Git提交 ssh: connect to host github.com port 22: Connection timed out解决方案

你们好,我是金金金。 场景 之前都是好好的,不知道今天为什么提交代码就这样了 排查 根据英文可以看出,ssh端口号被拒绝了,22号端口不行,那就换一个端口 造成error的原因 ssh端口被拒绝 解决 找到.ssh文件&#xff…...

Java调用WebService接口,SOAP协议HTTP请求返回XML对象

Java调用Web service接口SOAP协议HTTP请求,解析返回的XML字符串: 1. 使用Java的HTTP库发送SOAP请求,并接收返回的响应。 可以使用Java的HttpURLConnection、Apache HttpClient等库。 2. 将返回的响应转换为字符串。 3. 解析XML字符串&…...

Django框架二

一、模型层及ORM 1.模型层定义 负责跟数据库之间进行通信 2.Django配置mysql 安装mysqlclient,mysqlclient版本最好在13.13以上 pip3 install mysqlclient DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: "mysite1",USER:root,PASSWO…...

工业相机与镜头参数及选型

文章目录 1、相机成像系统模型1.1 视场1.2 成像简化模型 2、工业相机参数2.1 分辨率2.2 靶面尺寸2.3 像元尺寸2.4 帧率/行频2.5 像素深度2.6 动态范围2.7 信噪比2.8 曝光时间2.9 相机接口 3、工业镜头参数3.1 焦距3.2 光圈3.3 景深3.4 镜头分辨率3.5 工作距离(Worki…...

VSCode使用Makefile Tools插件开发C/C++程序

提起Makefile,可能有人会觉得它已经过时了,毕竟现在有比它更好的工具,比如CMake,XMake,Meson等等,但是在Linux下很多C/C源码都是直接或者间接使用Makefile文件来编译项目的,可以说Makefile是基石…...

用C语言验证“三门定理”

#include <stdio.h> #include <stdbool.h> #include <stdlib.h> #include <time.h>// 一个源自博弈论的数学游戏问题&#xff1a; // 参赛者会看见三扇门&#xff0c; // 其中一扇门的里面有一辆汽车&#xff0c; // 选中里面是汽车的那扇门&#xff0…...

计算机网络-分层结构,协议,接口,服务

文章目录 总览为什么要分层怎样分层正式认识分层概念小结 总览 为什么要分层 发送文件前要做的准备工作很多 把这个准备工作分层小问题解决&#xff0c;也就分层解决 怎样分层 每层相互独立&#xff0c;每层做的工作不同 界面自然清晰&#xff0c;层与层之间的接口能够体现…...

前端开发 2: CSS

在前端开发中&#xff0c;CSS&#xff08;层叠样式表&#xff09;是一种用于描述网页样式的语言。它控制着网页的布局、颜色、字体等外观效果。在本篇博客中&#xff0c;我将为你介绍 CSS 的基础知识和常用技巧&#xff0c;帮助你更好地掌握前端开发中的样式设计。 CSS 基础知…...

嵌入式-Stm32-江科大基于标准库的GPIO4个小实验

文章目录 一 、硬件介绍二 、实验&#xff1a;LED闪烁、LED流水灯、蜂鸣器提示2.1 需求1&#xff1a;面包板上的LED以1s为周期进行闪烁。亮0.5s,灭0.5s.....2.2 需求2: 8个LED实现流水灯2.3 需求3&#xff1a;蜂鸣器不断地发出滴滴、滴滴.....的提示音。蜂鸣器低电平触发。 三、…...

HackTheBox - Medium - Linux - Noter

Noter Noter 是一种中型 Linux 机器&#xff0c;其特点是利用了 Python Flask 应用程序&#xff0c;该应用程序使用易受远程代码执行影响的“节点”模块。由于“MySQL”守护进程以用户“root”身份运行&#xff0c;因此可以通过利用“MySQL”的用户定义函数来利用它来获得RCE并…...

Uniapp多选Popup(弹出层)

uniapp中多选组件很少&#xff0c;故个人简单开发了一个&#xff0c;可简单使用&#xff0c;也可根据个人需求稍微改进 支持的功能 单选多选&#xff08;默认&#xff09;限制选择数量默认选中禁用选项 属性说明 属性默认值说明singlefalsetrue为开启单选&#xff0c;否则为…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...

Copilot for Xcode (iOS的 AI辅助编程)

Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot&#xff0c;它能根据上下文补全代码&#xff0c;快速生成常用…...

中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点

中科院1区顶刊|IF14&#xff1a;多组学MR联合单细胞时空分析&#xff0c;锁定心血管代谢疾病的免疫治疗新靶点 当下&#xff0c;免疫与代谢性疾病的关联研究已成为生命科学领域的前沿热点。随着研究的深入&#xff0c;我们愈发清晰地认识到免疫系统与代谢系统之间存在着极为复…...