当前位置: 首页 > 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;否则为…...

什么是网络安全?网络安全概况

网络安全涉及保护我们的计算机网络、设备和数据免受未经授权的访问或破坏。 这个领域包括多种技术、过程和控制措施&#xff0c;旨在保护网络、设备和数据免受攻击、损害或未授权访问。网络安全涉及多个方面&#xff0c;包括但不限于信息安全、应用程序安全、操作系统安全等 …...

c语言小游戏之扫雷

目录 一&#xff1a;游戏设计理念及思路 二&#xff1a;初步规划的游戏界面 三&#xff1a;开始扫雷游戏的实现 注&#xff1a;1.创建三个文件&#xff0c;test.c用来测试整个游戏的运行&#xff0c;game.c用来实现扫雷游戏的主体&#xff0c;game.h用来函数声明和包含头文…...

如何本地安装Python Flask并结合内网穿透实现远程开发

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

在线App封装技术:HTML5的新生命

HTML5封装的魅力所在HTML5带来了丰富的多媒体功能、地理位置服务、离线存储等特性&#xff0c;使得Web应用的体验更加接近原生App。封装HTML5到App中&#xff0c;可以大大缩短开发周期&#xff0c;降低开发成本&#xff0c;并且一次编写&#xff0c;多平台运行&#xff0c;极大…...

Spring Boot 4.0:构建云原生Java应用的前沿工具

目录 前言 Spring Boot简介 Spring Boot 的新特性 1. 支持JDK 17 2. 集成云原生组件 3. 响应式编程支持 4. 更强大的安全性 5. 更简化的配置 Spring Boot 的应用场景 1. 云原生应用开发 2. 响应式应用程序 3. 安全性要求高的应用 4. JDK 17的应用 总结 作…...

Debian系统写Mysql时中文出现乱码无法定入的问题解决方案

原因是操作系统可能精简安装&#xff0c;没有GBK字符集&#xff0c;只有UTF8在转换或使用的时候有问题。 使用locale -a查看系统支持的字符集。正常的比较全的字符集的操作系统如下&#xff1a; 有问题的操作系统字符集如下&#xff1a; 解决方案&#xff1a; 步骤1&#…...

CPMS靶场练习

关键&#xff1a;找到文件上传点&#xff0c;分析对方验证的手段 首先查看前端发现没有任何上传的位置&#xff0c;找到网站的后台&#xff0c;通过弱口令admin 123456可以进入 通过查看网站内容发现只有文章列表可以进行文件上传&#xff1b;有两个图片上传点 图片验证很严格…...

CTFhub-bak文件

CTFhub-Web-信息泄露-备份文件下载-bak文件 题目信息 解题过程 看到提示说和index.php有关&#xff0c;在url后面加index.php.bak&#xff0c;跳转到http://challenge-7a4da2076cfabae6.sandbox.ctfhub.com:10800/index.php.bak网址&#xff0c;即&#xff1a; 跳转到下载页…...

本地部署轻量级web开发框架Flask并实现无公网ip远程访问开发界面

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架&#xff0c;采用Python编程语…...

面试题-MySQL如何定位慢查询

慢查询出现的情况就这些&#xff1a;聚合查询、多表查询、表数据量过大查询、深度分页查询。 表象&#xff1a;页面加载过慢、接口压测响应时间过长&#xff08;超过1S&#xff09;。 假如你的业务接口就是比较慢&#xff0c;你怎么知道是SQL的问题呢&#xff1f;就算是SQL的…...