【Redis】聊一下持久化机制-AOF

news2024/11/26 2:26:25

前言

持久化其实在任何存储系统中,都是避不开的话题,比如数据库系统就有ACID进行数据、日志的持久化。将文件写入到内存、缓存、磁盘中。在比如消息队列Kafka也有消息的持久化机制,为防止数据的丢失也需要将数据持久化存储。目的其实就是为了当出现系统宕机的或者异常崩溃的时候,防止数据的丢失。而具体的实现机制可能各不相同。而缓存的本质就是为了提升数据的读取性能。

Redis持久化

Redis的持久化为两种模式,一种是实时数据的操作命令追加,也就是AOF,另一种就是对某一个时间进行数据的快照数据存储。
需要注意的是默认是不开启AOF,需要设置一下 appendonly yes ,保存的文件是appendonly.aof文件
在这里插入图片描述

AOF

Aof (Append Only File) ,含义就是追加文件。**而这里只是追加每个写操作,**在数据库中有写前日志(Write Ahead Log)也就是在将数据写入到数据库中时,先备份一个日志文件,但是Redis正好相反利用的是写后日志。
第一步:先执行命令写入内存中,第二步:将日志写入到磁盘中。
在这里插入图片描述
在这里插入图片描述
1.Client作为命令的来源,会有多个源头以及源源不断的请求命令。
2.在这些命令到达Redis Server 以后并不是直接写入AOF文件,会将其这些命令先放入AOF缓存中进行保存。这里的AOF缓冲区实际上是内存中的一片区域,存在的目的是当这些命令达到一定量以后再写入磁盘,避免频繁的磁盘IO操作。
3.AOF缓冲会根据AOF缓冲区同步文件的三种写回策略将命令写入磁盘上的AOF文件。
4.随着写入AOF内容的增加为避免文件膨胀,会根据规则进行命令的合并(又称AOF重写),从而起到AOF文件压缩的目的。
5.当Redis Server 服务器重启的时候会从AOF文件载入数据。

实现原理

为什么要这样操作呢,其实这就需要看下Redis执行命令中包含哪些数据了。比如一个简单的set testkey testvalue命令
在这里插入图片描述
*3 代表有三个部分,$3代笔的是set3个字节,$7代表的是7个字节(testkey)
那么在执行命令之前其实没有办法直到Redis执行命令是否正确,如果写前日志的话,那么很可能保存的执行命令就是错误的,导致在数据恢复的时候出现错误,所以写后日志可以先执行命令,然后在备份追加日志文件。另一个也可以有效避免执行命令的阻塞。
但是,AOF其实也存在一定的问题,那就是如果一个执行命令刚好执行完毕,然后没有备份在AOF文件中,服务宕机,数据没有办法进行恢复,以及如果操作命令比较多的时候,其实顺序的执行(在同一个线程中),执行命令和日志追加。那么就会对系统的性能造成阻塞。

回写策略

在AOF中有个配置可以选择,appendfsync。

  • Always ,同步写回,操作完命令之后,立马将日志写到磁盘。
  • Everysec,每秒写回,操作完命令后先将命令写入到内存缓冲区中,然后1S间隔期 ,将内存缓冲区的数据写入到磁盘中。
  • NO,操作系统控制的写回,每个写命令操作完毕后,现将日志写到AOF文件的内存缓冲区中,然后操作系统决定何时写入到磁盘。

从上述可以看到,同步写回可以避免数据丢失,但是性能不好。每秒写回,虽然可以损失一定时间内的数据,但是性能居中。操作系统控制写入,性能最好,但是丢失数据的风险最大。所以这个时候就是trade-off。结合自己的业务场景来考虑。在高性能和高可靠性之间进行选择,如果要求高性能,并且运行数据丢失可以选择后两者,如果必须是高可靠性,那么就需要选择第一个。
在这里插入图片描述

重写机制

AOF在重写的时候针对的是写操作命令的记录日志,当我们读取key1 v1的时候,就会写入set key1 v1, 但是其实当我们对同一个key进行多次的操作后,其实是以最新的数据状态进行写入文件的。比如set key v2、set key v3,是按照v3版本进行写入。这样其实就可以避免写入多次数据,有效从写入端减少AOF文件的大小,在数据恢复的时候,也可以更加快速的执行。
在这里插入图片描述
比如图中,多次操作后是按照DCN数据进行重写的。AOF重写减少日志大小
虽然AOF重写可以减少日志文件的大小,但是当AOF文件足够大时,将整个数据库的数据写到磁盘中,其实也是一个非常耗时的过程,也就是会不会出现阻塞问题

AOF重写阻塞问题

AOF重写日志的时候,其实会fork出一个子线程执行重写任务。这样可以从根本上解决阻塞问题。但是具体是如何做?
1.先fork出一个bgrewriteaof子进程,然后将主线程的内存数据拷贝一份,写入到子进程的重写日志中
2.主线程可以处理新来的请求,然后写入到AOF缓冲区,以供数据备份,然后也会写入到新的AOF缓冲区,然后子进程会将新的数据写到AOF文件中,实现数据的备份。
在这里插入图片描述

小结

本篇主要介绍了Redis持久化机制中的一种,AOF,主要是通过追加日志的形式记录写操作命令,然后对应的流程就是先写入到Redis的时候,然后写入到内存缓冲区中,然后按照不同的策略进行写入磁盘,而日志是写后日志,不同于数据库的写前日志。以及对应的三个不同回写策略,为避免出现AOF文件过大,采用重写机制。但是重写机制虽然可以避免AOF文件过大,但是在读取AOF文件的过程时,仍然是一个很慢的过程。所以也就引入了另一种持久化机制,快照机制,RDB,下一篇文章,介绍一下RDB机制。

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

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

相关文章

javaweb系列- JavaScript事件

1.6 JavaScript事件 1.6.1 事件介绍 如下图所示的百度注册页面,当我们用户输入完内容,百度可以自动的提示我们用户名已经存在还是可以使用。那么百度是怎么知道我们用户名输入完了呢?这就需要用到JavaScript中的事件了。 什么是事件呢&…

【SpringBoot】整合第三方技术Junit. MybatisPlus druid

【SpringBoot】整合第三方技术 整合junit整合MyBatis整合Mybatis-plus使用阿里云创建工程 SpringBoot整合druid 整合junit 自己定义一个功能,测试功能接口 测试步骤注入你要测试的对象 提前声明为bean资源执行你要测试的方法 package com.ustc.sp7;import com.us…

MySQL—MVCC

文章目录 数据库并发的场景有三种MVCC概念读-写3个记录隐藏列字段undo log模拟MVCC Read ViewRC与RR的本质区别RCRR 数据库并发的场景有三种 读-读: 不存在任何问题,也不需要并发控制 读-写∶有线程安全问题,可能会造成事务隔离性问题,可能遇…

阿里云GPU服务器租用费用包年包月、一个小时和学生价格

阿里云GPU服务器租用价格表包括包年包月、一个小时收费以及学生GPU服务器租用费用,阿里云GPU计算卡包括NVIDIA V100计算卡、T4计算卡、A10计算卡和A100计算卡,GPU云服务器gn6i可享受3折,阿里云百科分享阿里云GPU服务器租用价格表、GPU一个小时…

chatgpt赋能Python-aidlearning安装python

安装Python的必要性和意义 Python是一种非常流行的编程语言,它的易学易用,高效实用,使得很多人选择使用Python进行编程。对于AI学习,Python更是至关重要,因为很多AI框架和算法都需要使用Python进行编写和实现。因此&a…

Java设计模式 14-访问者模式

访问者模式 这个模式用的很少,《设计模式》的作者评价为: 大多情况下,你不需要使用访问者模式,但是一旦需要使用它时,那就真的需要使用了 一、测评系统的需求 1)将观众分为男人和女人,对歌手进行测评&…

逻辑回归优化技巧总结(全)

本文从实际应用出发,以数据特征、优化算法、模型优化等方面,全面地归纳了逻辑回归(LR)优化技巧。 一、LR的特征生成 逻辑回归是简单的广义线性模型,模型的拟合能力很有限,无法学习到特征间交互的非线性信息…

详解c++---继承

目录标题 为什么会有继承继承的概念继承的定义基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承和友元继承与静态成员什么是菱形继承如何解决菱形继承解决的底层原理继承和组合 为什么会有继承 在平时的使用过程中通常会出现一部分数据会在很多其他地方被使用…

微信商城小程序怎么开通?

随着移动互联网的快速发展,微信商城小程序成为了越来越多企业开启电商新模式的首选之一。微信商城小程序不仅在运营方式上具有很大优势,还能够提供更加便利和舒适的购物体验。那么微信商城小程序怎么开通呢?下面,我们将简单介绍微…

ARM嵌入式编译之循环操作(LOOP)优化

取决于循环的迭代次数,完成循环可能需要花费大量时间,此外,每次迭代时,需要判断循环条件是否成立,这一操作也会降低循环的性能。 1 循环展开-Loop unrolling 为了减少每次循环都需要判断迭代条件带来的性能影响&…

chatgpt赋能Python-20210712用python提取年月日

使用Python实现年月日的提取 在进行数据分析或开发中,提取年月日信息是非常重要的一项任务。而Python作为一门优秀的编程语言,其内置的多种库和函数可以帮助我们快速且高效地实现这一任务。本篇文章将会介绍使用Python提取年月日的方法以及注意事项。 …

串口与4g模块

1.认识4G模块 1、接线与插卡:EC03-DNC4G通信模块,生产的公司是EBYTE(亿佰特)。官网上有软件和用户手册下载地址。 保证插卡不插错,一是使用SIM卡卡套,二是方向保证正确。如图位置是SIM卡状态灯&#xff0…

Trie树

目录 一、Tire树的概念二、Trie树的应用Trie字符串统计最大异或对(难点)暴力遍历法Trie树优化法 一、Tire树的概念 Trie树又称字典树、单词查找树。是一种能够高效存储和查找字符串集合的数据结构。 示例: 利用Tire树的数据结构储存字符串 储…

跟庄买股票得新技巧(第三弹)集合竞价战法

尾盘抢筹(参考昨天) 57分 12.35 收盘价 12.42 股价明显上涨(越大越好)全天阳线,否则突然变高就有作线的嫌疑12.35到12.42,滞留大量为成交单(买一到买十存在大量买单,否则有做线嫌疑…

Spring-boot 结合Thymeleaf--拦截器--文件上传

目录 Spring-boot 结合Thymeleaf 官方文档 基本介绍 ● Thymeleaf 是什么 ● Thymeleaf 的优点 ● Thymeleaf 的缺点 ● Thymeleaf 机制说明 Thymeleaf 语法 表达式 1. 表达式一览 2.字面量 3. 文本操作 4.运算符 3. 比较运算 4. 条件运算 th 属性 迭代 条件运…

4年经验面试要15K,一问自动化却以为我在刁难他?

我这次是公司招聘的面试官之一,主要负责一些技术上的考核,这段时间还真让我碰到了不少奇葩求职者 昨天公司的HR小席刚跟我吐槽:这个星期没有哪天不加班的!各种招聘网站上的消息源源不断,连吃饭都要回消息…… 看来最…

【Java面试】JVM垃圾回收相关知识点

文章目录 1. Java中对象有哪些引用类型?2. 有哪些基本的垃圾回收算法?3. 什么是分区收集算法?和分代收集什么区别?4. 什么是Minor GC、Major GC、Full GC?5. 什么情况下会触发Full GC? 1. Java中对象有哪些引用类型&a…

Linux 常用指令的使用

文章目录 1. 基础命令1)ls2)pwd3)cd4)touch5)cat6)mkdir7)rm8)cp9)mv10)more11)less12)head13)tail14)vim15&a…

《论文阅读》常识推理的生成知识提示

《论文阅读》常识推理的生成知识提示 前言简介相关知识模型构架Generated Knowledge PromptingKnowledge GenerationKnowledge Integration via Prompting推理阶段前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到失望? 小…

linux RVM安装使用

前言 RVM(Ruby Version Manager)是一个支持多版本Ruby的命令行程序,它有助于为开发和生产环境提供一致性可靠的Ruby版本。 它能够提供最新版本的Ruby,并管理多个版本,几乎在所有操作系统上都能安装和管理 Ruby。RVM 还…