Redis持久化——AOF
介绍
Redis是运行在内存中的数据库,当我们关闭了Redis服务器后,内存中的数据会丢失吗?
答案是不会的,因为Redis有持久化功能,能够将内存中的数据保存到磁盘中的文件,以此来实现数据的永久保存。
在Redis中,有两种持久化功能:
- RDB持久化功能,简称RDB快照
- AOF持久化功能,简称AOF日志
关于RDB快照,建议先去看看我的这篇文章Redis持久化——RDB快照_秋天code的博客-CSDN博客
AOF日志
AOF的全称是,Append Only File,日志文件追加写。
AOF日志记录的是每次对数据进行修改的命令,通过这些命令就可以恢复数据库状态
注意:读命令是不会被记录到AOF日志中的,因为不涉及数据的变化。
Redis每执行一条写命令,就会把该命令以追加的方式写入到AOF日志文件中,然后在Redis服务器启动时,就会通过此日志文件中的命令,来恢复数据库状态,大致的工作流程:

在Redis中,默认开启的是RDB持久化功能,并没有开启AOF持久化功能,因此我们修改配置项来开启AOF持久化功能:
appendonly yes // 表示开启AOF持久化(no关闭)
appendfilename "appendonly.aof" // AOF日志文件的名称
AOF日志写回时机
对AOF日志文件追加写的操作是IO操作,肯定是比内存操作要慢的,又因为Redis是单线程的,所以IO操作会阻塞后面的请求,因此为了提高Redis的性能,会在内存中有一块缓冲区,专门用来存放每次写命令产生的AOF日志,将缓冲区中的命令批量写回到AOF文件中。
先来看AOF日志写入的详细流程图:

Redis中提供了3种写回策略,控制以上的第三步,即调用操作系统的IO操作的时机。
在Redis的配置文件中,appendsync配置项就是用来配置AOF的回写策略,有三个值Always、Everysec、No
Always,每次执行写操作命令完成后,同步将AOF日志写回磁盘Everysec,每秒,每次执行写操作命令,会先记录此命令到内存中的AOF缓冲区,隔1秒后,将缓冲区中的AOF日志写回到AOF文件中。No,不由Redis控制写回硬盘的时机,转交给操作系统控制。也就是说,每次写操作命令执行完后,先将命令写入到内存中的AOF缓冲区,再由操作系统来决定何时将此缓冲区中的内存写回到磁盘文件中。
总结这三种策略:

AOF重写机制
AOF日志文件,随着执行写操作的命令次数越来越多,文件的大小会越来越大。
当一个AOF日志文件过大时,就会严重影响性能:当Redis服务器启动时,需要从AOF日志文件中恢复数据,Redis是单线程的,会逐条执行其中的命令,当AOF文件过大时,命令也会很多,整个数据恢复过程就会很慢。
Redis为了避免AOF日志文件过大的问题,提供了AOF重写机制,当AOF文件的大小超过设定的阈值时,Redis就会启动AOF重写机制,来压缩AOF文件
具体的原理是:
AOF重写机制是在重写时,读取当前数据库中的所有键值对,然后将每一个键值对用一条命令记录到新的AOF文件中,等到全部记录完成后,就会将新的AOF文件替换掉旧的AOF文件,AOF文件的体积会大大缩小。(因为一条记录、键值对,可能会对应多次写操作,我们只需要记录最终此键值对的状态即可,因此就会把原来旧的AOF文件中的对同一键值对写的命令,最终替换成一条写命令,所以AOF文件体积会缩小)
AOF和RDB对比
- AOF日志文件是文本文件,记录的是所有的写命令;而RDB文件是二进制文件,记录的就是数据本身。
- AOF日志恢复数据的速度较慢,即在服务器启动时占用的时间较长。RDB文件的载入会较快。(因为AOF持久化功能会把AOF日志中的每条命令再执行一遍,当AOF日志非常大时,需要执行的命令就非常多,而且Redis是单线程的,需要一条一条的执行,所以恢复数据的效率较低)
参考文章
- 《Redis设计与实现》
- AOF 持久化是怎么实现的? | 小林coding
相关文章:
Redis持久化——AOF
介绍 Redis是运行在内存中的数据库,当我们关闭了Redis服务器后,内存中的数据会丢失吗? 答案是不会的,因为Redis有持久化功能,能够将内存中的数据保存到磁盘中的文件,以此来实现数据的永久保存。 在Redis中…...
Qt 嵌入Vue项目 flapMap 浏览器兼容性问题
最近有个需求,Qt工程需要嵌入vue项目,本来是很简单的事情。在我的PC上启动Vue项目,同事PC上用浏览器通过IP地址可以正常加载vue项目,但用Qt嵌入总是失败。问题定位步骤如下: 1)换了一个简单的vue项目&…...
1.SpringMVC接收请求参数及数据回显:前端url地址栏传递参数通过转发显示在网页
1、SpringMVC 处理前端提交的数据 1.1 提交的域名和处理方法的参数不一致,使用注解解决 1.2 提交的域名和处理方法的参数不一致,使用注解解决 1.3 提交的是一个对象 2、前端url地址栏传递的是一个参数 请求地址url:http://localhost:8080/s…...
C++ Primer Plus: 第10章(2)
第10章编程题: (1) Account.h: #ifndef ACCOUNT_H_ #define ACCOUNT_H_#include <string>class Account { private:std::string name ;std::string code ;double money ; public:Account() ;Account(std::string Name, std::string Co…...
c++中的extern关键字
extern关键字主要修饰变量或函数,表示该函数可以跨文件访问,或者表明该变量在其他文件定义,在此处引用。 extern修饰变量 (1)如果某变量int m在a.c中定义声明,则其他b.c文件访问时,需要用exte…...
javaScript:快乐学习计时器
目录 一.前言 二.计时器 1.计时器的分类 2. 创建计时器的方式 创建间隔计时器 创建方式三种 1.匿名函数 2.使用函数直接作为计时器的执行函数 2.使用函数直接作为计时器的执行函数,用字符串的形式写入 3.计时器的返回值 4.清除计时器 5.延迟计时器 相关代码 一.前言 在…...
onnxruntime 支持的所有后端
1 代码导出 import onnxruntime as ort aaa ort.get_all_providers() print(aaa)1. 1 下面是ort支持的所有后端 TensorrtExecutionProvider, CUDAExecutionProvider, MIGraphXExecutionProvider, ROCMExecutionProvider, OpenVINOExecutionProvider, DnnlExecutionProvider…...
k8s 自身原理 5
我们知道容器是通过 pod 来承载的,我们在 k8s 中,服务都是跑在 pod 里面的,pod 里面可以跑 1 个容器,或者跑多个容器,那么咱们 pod 里面跑 1 个服务容器,咱真的就以为里面就只有这样个容器吗? …...
机器视觉应用开发什么最重要?
(QQ群有答疑)零基础小白快速上手海康VisionMaster开发系列课程 高级语言在机器视觉就是工具,机器视觉软件,在机器视觉中也是工具,在机器视觉应用开发中,图像处理是最重要的,一切看图像ÿ…...
React+Typescript使用接口泛型处理props
好 刚讲完组件 那么 这次 我们来看一下 数据传递的 props 还是上文的案例 例如 我们想将 title 传给Hello组件 之前我们可以直接这样 以一个标签属性的形式传过去 而我们在子组件中 这样去使用 但现在 我们从编辑器中都可以看出 这种写法已经不行了 然后 我们将 hello 组件…...
自定义python文件import导入ModuleNotFoundError: No module named ‘***‘ 问题
自定义python文件import导入ModuleNotFoundError: No module named ‘***’ 问题 错误代码: import configparser import os.path import sys from bin import swk_mysql_create, swk_redis_create这里导入自定义python文件,其中swk_mysql_create.py文…...
Codeforces Round 893 (Div. 2)B题题解
文章目录 [The Walkway](https://codeforces.com/contest/1858/problem/B)问题建模问题分析1.分析所求2.如何快速计算每个商贩被去除后的饼干数量代码 The Walkway 问题建模 给定n个椅子,其中有m个位置存在商贩,在商贩处必须购买饼干吃,每隔…...
HTTP响应状态码大全:从100到511,全面解析HTTP请求的各种情况
文章目录 前言一、认识响应状态码1. 什么是HTTP响应状态码2. Http响应状态码的作用3. 优化和调试HTTP请求的建议 二、1xx 信息响应1. 认识http信息响应2. 常见的信息响应状态码 三、2xx 成功响应1. 认识HTTP成功响应2. 常见的成功响应状态码 四、3xx 重定向1. 认识http重定向2.…...
Vue-10.集成.env
.env、.env.development 和 .env.preview .env、.env.development 和 .env.preview 文件是用于配置环境变量和应用程序设置的文件,它们在项目开发和部署过程中起到关键作用。这些文件用于在不同的环境中设置不同的变量值,以满足不同环境下的配置需求。 …...
强训第33天
选择 C A ping是TCP/IP协议族的一部分,使用ICMP协议,ICMP底层使用IP协议。如果要ping其他网段,则需要设置网关。 如果是二层交换机故障,则ping同网段的也会不通。 C Dos攻击被称之为“拒绝服务攻击”,其目的是使计算机…...
【CTF-web】buuctf-[极客大挑战 2019]EasySQL 1(sql注入)
题目链接 根据题目判断出可能需要sql注入,看源码可知数据是通过GET的方式传输的,即放在url的username和password两个参数中。 只要将username输入为1 or 11#,password可以为任何值,即可顺利登录。 需要注意的是url中的井号表示…...
脚本语言与编译语言的区别
文章目录 一、语法差异二、执行方式差异三、应用领域差异四、总结 一、语法差异 脚本语言:脚本语言通常使用解释器逐行执行,不需要事先编译。它的语法相对简单,易于学习和使用。常见的脚本语言有Python、JavaScript和Ruby等。 编译语言&…...
大型企业或者组织,组建专属的虚拟局域网,深入理解相关的配置和搭建使用、网络加速和网络优化,可夸地区夸国际使用,深入搞懂每项配置的作用和含义
大型企业或者组织,组建专属的虚拟局域网,深入理解相关的配置和搭建使用、网络加速和网络优化,可夸地区夸国际使用,深入搞懂每项配置的作用和含义。 1、openxxx介绍与图解 1.1 openxxx介绍 openxxx 是一个基于 OpenSSL库的应用层 虚拟局域网 实现。和传统 虚拟局域网 相…...
数据结构:二叉树的递归实现(C实现)
个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》 文章目录 前言一、树的概念二、二叉树二叉树的概念二叉树的性质 三、二叉树链式结构实现二叉树节点定义创建二叉树节点遍历二叉树先序遍历二叉树(BinaryTreePrevOrder)中序遍历二叉树(BinaryTree…...
MinGW编译运行报错RTTI symbol not found for class ‘XXX‘
最近在调试程序时莫名的出现图中报错: 还遇到过for class QObject,在此记录一下,排查后发现,原因都是有资源被重复释放导致的。...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...
渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
阻止除自定义标签之外的所有标签 先输入一些标签测试,说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时(如通过点击或键盘导航&…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...
C++ 类基础:封装、继承、多态与多线程模板实现
前言 C 是一门强大的面向对象编程语言,而类(Class)作为其核心特性之一,是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性,包括封装、继承和多态,同时讨论类中的权限控制,并展示如何使用类…...
计算机系统结构复习-名词解释2
1.定向:在某条指令产生计算结果之前,其他指令并不真正立即需要该计算结果,如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方,那么就可以避免停顿。 2.多级存储层次:由若干个采用不同实现技术的存储…...
解密鸿蒙系统的隐私护城河:从权限动态管控到生物数据加密的全链路防护
摘要 本文以健康管理应用为例,展示鸿蒙系统如何通过细粒度权限控制、动态权限授予、数据隔离和加密存储四大核心机制,实现复杂场景下的用户隐私保护。我们将通过完整的权限请求流程和敏感数据处理代码,演示鸿蒙系统如何平衡功能需求与隐私安…...
