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

Redis面试专题-持久化

目录

前言

持久化相关知识

1.三种持久化机制

2.RDB持久化

3.深入剖析一下RDB持久化过程

4.AOF持久化

5.RDB和AOF对比​编辑

面试题

1.redis持久化机制有哪些?

2.那仔细讲讲你对他们的理解

3.你刚刚说AOF的文件很大,那AOF文件会越来越大?


前言

开始Redis面试知识的复习和资料的收集(收集和参考了网上的优质文章),本篇文章会不断更新,本系列文章主要分为两部分,一部分是该专题所涉及的相关基础知识,另一部分是面试题与思考题,大部分重要知识和基础知识的延伸会在面试题和思考题中给出,这样做的目的是给出具体的场景,便于理解知识(相较于直接在知识中展出),且我会以相对口语化的方式叙述。

建议关注,随着我复习的进度,内容会一直得到补充

持久化相关知识

1.三种持久化机制

RDB持久化,AOF持久化,混合型持久化(将RDB和AOF结合在一起,这里就不过多赘述了)

2.RDB持久化

RDB全称叫做Redis数据备份文件,也叫做Redis数据快照,将内存中所有数据都记录到磁盘中,当Redis故障或重启时,从磁盘中读取快照文件,恢复数据

主动进行RDB持久化:

事实上,redis有自己的自动触发持久化机制,并且配置在了配置文件中:

由上面可见,两次备份间如果发生宕机,会出现数据丢失,因为其备份的频率很低

配置文件中关于RDB的其他配置

3.深入剖析一下RDB持久化过程

bgsave异或持久化可以做到几乎对主进程0阻塞,为什么说是几乎呢,因为主进程去fork这个子进程的时候是阻塞的,为了让主进程尽快得去处理其他请求,bgsave是如何实现:

在linux中,所有进程都无法直接操作物理内存,操作系统会为进程分配虚拟内存,然后再虚拟内存中会有一个与物理内存做映射的表叫做页面,通过这个对物理内存进行读写,当fork子线程的时候,不是把内存做拷贝,而是把页表进行拷贝,此时子进程就可以对内存中的数据进行修改,这样,无需拷贝内存中的数据就可以实现内存共享,使得fork子线程的速度非常快

子线程就会读取内存中的数据并且写入磁盘中的一个RDB文件中来持久化,并替换旧的RDB文件 

但由于是异步的,此时子进程正在读取数据,主进程可能收到修改数据的指令,此时读写会发生冲突,为了解决这个问题,copy采用了copy-on-write技术,共享内存只能读,当主线程要修改共享内存中的某个数据,例如数据A时,会将该数据A复制出来,并进行修改,此后对于数据A的读和写都在副本中进行

极端情况下,当子线程读取数据存储到RDB文件内的速度很慢,此时主线程收到了将所有数据进行修改的请求,那么所有数据都要复制一份,变成双倍内存

4.AOF持久化

AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看作是命令日志文件。

AOF默认是关闭的,打开:

AOF记录的频率:

由于是记录命令,AOF比RDB文件大得多,并且记录的大部分名称都是无效的,只有对一个key的最后一次写操作才有意义,可以通过bgrewriteaof命令,让AOF文件执行重写功能

自动触发文件重写阈值:

5.RDB和AOF对比


面试题

1.redis持久化机制有哪些?

RDB,AOF,混合型持久化

2.那仔细讲讲你对他们的理解

RDB:RDB是通过将内存中当前进程的数据生成快照(.rdb)文件保存到硬盘中,可以自动触发或者手动触发

自动触发的配置写在了配置文件中:

900秒内如果至少1个key被修改,就执行bgsave,300秒内如果至少10个key被修改,就执行bgsave,10000秒内如果至少60个key被修改,就执行bgsave

手动触发:save和bgsave,其中save是主线程来进行生成RDB文件进行持久化过程,会造成长时间阻塞,一般使用bgsave,主线程会fork一个子线程,并将自己的快照文件复制给子线程,子线程根据快照文件读取共享内存数据到.rdb文件中,读取完成后替换旧的rbd文件进行持久化操作

RDB持久化的优点在于使用子线程来异步持久化,主线程不会进行IO操作,保证了Redis的高性能,而且其存储的是压缩的二进制文件,适用于备份,全量复制,并且其加载速度远大于AOF文件

缺点在于其持久化间隔时间比较长,如果下一次持久化前发生宕机等故障,会造成数据的丢失,即无法做到实时持久化,并且在fork子线程进行持久化时,如果主线程进行修改操作,需要对修改的数据先进行复制,理论上最差的情况是全都复制一遍,即占用两倍的内存。并且RDB二进制文件存在新老版本不兼容的问题.

AOF:AOF持久化是将命令像日志一样写入文件中进行持久化,其持久化策略有三种

其优点在于能将数据丢失的风险大大降低,保证数据是最新的,并且将命令写入文件的操作是异步的,不允许主线程

缺点在于因为是保存所有命令,其文件比RDB大得多,数据恢复其实也就是执行命令的过程,所以会慢很多

混合型持久化的优点在于效率大幅提升,缺点在于最终文件为.aof文件,在4.0版本之前不是被该aof文件,且由于前部分时RDB格式,阅读性差

3.你刚刚说AOF的文件很大,那AOF文件会越来越大?

AOF其实是有他的重写机制的,当AOF文件比上一次重写时的文件大小增长100%并且文件大小不小于64M时,会进行重写,重写时如果客户端发生修改操作,这边也是copy-on-write技术,重写时,新的变更操作会写到原AOF文件中,同时这些变更操作会被Redis收集,最差情况就和RDB一样,;两倍内存,当内存数据被全部写入到新的AOF文件后,新的变更操作会追加进去,此后所有新的操作会写到新的aof文件中,因为只有重写完成后才会更改写入文件,所以如果发生故障,不会影响到原来的aof文件,所有比较可靠


相关文章:

Redis面试专题-持久化

目录 前言 持久化相关知识 1.三种持久化机制 2.RDB持久化 3.深入剖析一下RDB持久化过程 4.AOF持久化 5.RDB和AOF对比​编辑 面试题 1.redis持久化机制有哪些? 2.那仔细讲讲你对他们的理解 3.你刚刚说AOF的文件很大,那AOF文件会越来越大&#xf…...

如何将快捷指令添加到启动台

如何将快捷指令添加到启动台/Finder/访达(Mac) 1. 打开快捷指令创建快捷指令 示例创建了一个文件操作测试的快捷指令。 2. 右键选择添加到程序坞 鼠标放在待添加的快捷指令上。 3. 右键添加到访达 鼠标放在待添加的快捷指令上。 之后就可以在启…...

ansible自动化运维(二)ad-hoc模式

目录 Ansible模块(ad-hoc模式) 1.command模块:远程执行命令 2.shell 模块:远程执行命令,支持管道,重定向 3.Raw模块:先登录,再执行,最后退出 4.Script模块&#xff…...

技术栈6:Docker入门 Linux入门指令

目录 1.Linux系统目录结构 2.处理目录的常用命令 3.Docker概述 4.Docker历史 5.Docker基本组成 6.Docker底层原理 7.Docker修改镜像源 8.Docker基本命令 9.Docker创建Nginx实战 10.数据卷 11.本地目录直接挂载* 12.镜像和dockerfile 13.容器互联与自定义网络 14.…...

OPStack Optimism Layer2

概述 OP Stack 是标准化、共享和开源的开发堆栈,为 Optimism 提供支持,由 Optimism Collective 维护。 Optimism Bedrock 是 OP Stack的当前版本。 Bedrock 版本提供了用于启动生产质量的 Optimistic Rollup 区块链的工具。此时,OP Stack不同层的 API 仍然与Stack的 Rollu…...

Leetcode—1498. 满足条件的子序列数目【中等】

2024每日刷题&#xff08;210&#xff09; Leetcode—1498. 满足条件的子序列数目 C实现代码 class Solution { public:int numSubseq(vector<int>& nums, int target) {const int MOD 1e9 7;int n nums.size();vector<int> pows(n, 1);for(int i 1; i &…...

生活大爆炸版石头剪刀布(洛谷P1328)

生活大爆炸版石头剪刀布(洛谷P1328) [NOIP2014 提高组] 前言&#xff1a; 由于洛谷发布题解有限制&#xff0c;所以在CSDN上发布洛谷题解。 所有题解均是Java语言, 但是思路是相同的 每篇都是刷题日常&#xff0c;尽量讲清楚算法逻辑。 希望有问题还请大佬们指导&#xff01; …...

OmniParser一种用于增强视觉语言模型与用户界面交互效果的技术

OmniParser一种用于增强视觉语言模型与用户界面交互效果的技术 OmniParser的核心功能是将用户界面截图转换为结构化元素&#xff0c;这一过程涉及几个关键步骤和技术要素&#xff0c;解决了视觉语言模型&#xff08;VLMs&#xff09;在与用户界面交互时所面临的多种挑战。 1.…...

Unity引擎UI滚动列表——滚动复用基础介绍

大家好&#xff0c;我是阿赵。 一、滚动复用的介绍 在制作游戏的过程中&#xff0c;经常会遇到一些需要显示数量比较大的数据的情况。比如说&#xff0c;一个排行榜&#xff0c;需要展示当前服务器前一千个玩家的排名。或者游戏的背包容量特别大&#xff0c;可以有几千个格子。…...

在 Windows 11 WSL (Ubuntu 24.04.1 LTS) | Python 3.12.x 下部署密码学库 charm

1. 在 Windows 11 上部署 Ubuntu (WSL) 由于作者没有高性能的 Ubuntu 服务器或个人电脑&#xff0c;且公司或学校提供的 Ubuntu 服务器虽然提供高性能 GPU 等硬件配置但通常不会提供 root 权限&#xff0c;因而作者通过在搭载了 Windows 11 的个人电脑上启动 Ubuntu (WSL) 来进…...

【六足机器人】01功能开发

包含&#xff1a;WIFI模块、GPS模块、语言模块、调试信息接口。 一、硬件连接 huart4&#xff08; PA0、 PA1 &#xff09;与GPS模块连接。 huart3&#xff08;PB10、PB11&#xff09;与ESP8266模块连接。 huart2&#xff08; PA2、 PA3 &#xff09;与语音模块连接。 hu…...

notepad++安装教程(超详细)

1.下载地址&#xff08;可以私信博主&#xff09; https://notepad-plus.en.softonic.com/download 2.解压安装...

创建简单的 PL/pgSQL 存储过程

文章目录 创建简单的 PL/pgSQL 存储过程CREATE OR REPLACE FUNCTIONadd_two_numbers(a integer, b integer)RETURNS integerAS$$ ... $$函数体LANGUAGE plpgsql 创建带有 IN 和 OUT 参数的存储过程创建修改数据的存储过程创建带有异常处理的复杂存储过程 在 PostgreSQL 中&…...

Java项目实战II基于微信小程序的无中介租房系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着城市化进程的加速&#xff0c;租房市场日益繁荣&a…...

Node.js实现WebSocket教程

Node.js实现WebSocket教程 1. WebSocket简介 WebSocket是一种在单个TCP连接上提供全双工通信的协议&#xff0c;允许服务器和客户端之间进行实时、双向通信。本教程将详细讲解如何在Node.js中实现WebSocket。 2. 技术选型 我们将使用ws库来实现WebSocket服务器&#xff0c;…...

Docker Compose实战一( 轻松部署 Nginx)

通过过前面的文章&#xff08;Docker Compose基础语法&#xff09;你已经掌握基本语法和常用指令认识到Docker Compose作为一款强大工具的重要性&#xff0c;它极大地简化了多容器Docker应用程序的部署与管理流程。本文将详细介绍如何使用 Docker Compose 部署 Nginx&#xff0…...

hive分区分桶、数据倾斜总结

一、hive的基本概念 hive是一个构建在hadoop上的数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表并提供数据查询功能 二、hive的特点 &#xff08;1&#xff09;数据是存储在hdfs上 &#xff08;2&#xff09;底层是将sql转换为MapReduce任务进行计算 …...

unity打包到安卓帧率降低

这个问题遇到过很多次了我的做法就是直接设置Application.targetFrameRate60 参考...

【Python3】装饰器 自动更新缓存

自动更新缓存的需求场景 在某些应用中&#xff0c;我们可能需要定期从外部数据源&#xff08;如 Redis 或者远程接口&#xff09;拉取数据&#xff0c;并将其缓存在内存中。当有其他代码需要访问这些数据时&#xff0c;可以立刻从内存获取最新数据&#xff0c;而无需每次都进行…...

通过EPEL 仓库,在 CentOS 7 上安装 OpenResty

通过EPEL 仓库&#xff0c;在 CentOS 7 上安装 OpenResty 通过EPEL 仓库&#xff0c;在 CentOS 7 上安装 OpenResty步骤 1: 安装 EPEL 仓库步骤 2: 安装 OpenResty步骤 3: 启动 OpenResty步骤 4: 设置开机自启步骤 5: 验证安装说明 通过EPEL 仓库&#xff0c;在 CentOS 7 上安装…...

[RabbitMQ] RabbitMQ常见应用问题

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

每日速记10道java面试题13-MySQL篇

其他资料 每日速记10道java面试题01-CSDN博客 每日速记10道java面试题02-CSDN博客 每日速记10道java面试题03-CSDN博客 每日速记10道java面试题04-CSDN博客 每日速记10道java面试题05-CSDN博客 每日速记10道java面试题06-CSDN博客 每日速记10道java面试题07-CSDN博客 每…...

乐鑫科技嵌入式面试题及参考答案(3万字长文)

嵌入式开发为什么用 C 语言,而不用 C++ 语言? 在嵌入式开发中,C 语言被广泛使用而 C++ 相对少用有以下一些原因。 首先,C 语言具有更高的效率。嵌入式系统通常资源受限,包括处理器速度、内存容量等。C 语言的代码生成效率高,能够生成紧凑的机器码,占用较少的内存空间和处…...

Leetcode 每日一题 56.合并区间

目录 问题描述 示例 示例 1 示例 2 问题分析 算法设计 步骤 1&#xff1a;排序 步骤 2&#xff1a;合并区间 步骤 3&#xff1a;返回结果 过题图片 代码实现 复杂度分析 题目链接 结语 问题描述 给定一个区间数组 intervals&#xff0c;其中每个区间由两个整数 s…...

【Vue】v-model、ref获取DOM

目录 v-moel v-model的原理 v-model用在组件标签上 方式 defineModel()简写 ref属性 获取原生DOM 获取组件实例 nextTick() v-moel v-model&#xff1a;双向数据绑定指令 数据变了&#xff0c;视图跟着变&#xff08;数据驱动视图&#xff09;视图变了&#xff0c;数…...

Python 类的设计(以植物大战僵尸为例)

关于类的设计——以植物大战僵尸为例 一、设计类需满足的三要素1. 类名2. 属性和方法 二、以植物大战僵尸的为例的类的设计1. 尝试分类2. 创建对象调用类的属性和方法*【代码二】*3. 僵尸的继承 三、代码实现 一、设计类需满足的三要素 1. 类名 类名&#xff1a;某类事物的名…...

python中权重剪枝,低秩分解,量化技术 代码

目录 python中权重剪枝,低秩分解,量化技术 代码 权重剪枝 低秩分解 scipy 量化技术 python中权重剪枝,低秩分解,量化技术 代码 权重剪枝 权重剪枝可以通过PyTorch的torch.nn.utils.prune模块实现。以下是一个简单的例子: import torch import torch.nn as nn impor…...

调用matlab用户自定义的function函数时,有多个输出变量只输出第一个变量

很多朋友在使用matlab时&#xff0c;会使用或自己编辑多个function函数&#xff0c;来满足自己对任务处理的要求&#xff0c;但是在调用function函数时&#xff0c;会出现这个问题&#xff1a;调用matlab用户自定义的function函数时&#xff0c;有多个输出变量只输出第一个变量…...

RabbitMQ七种工作模式之简单模式, 工作队列模式, 发布订阅模式, 路由模式, 通配符模式

文章目录 一. Simple(简单模式)公共代码:生产者:消费者: 二. Work Queue(工作队列模式)公共代码:生产者:消费者1, 消费者2(代码相同): 三. Publish/Subscribe(发布/订阅模式)公共代码:生产者:消费者: 四. Routing(路由模式)公共代码:消费者: 五. Topics(通配符模式)公共代码:生…...

Win10安装kafka并用C#调用

kafka安装 jdk、kafka版本如下&#xff0c;zookeeper使用kafka自带版本 安装包下载位置:https://download.csdn.net/download/henreash/90087368 (赚点csdn下载资源分) 安装jdk后&#xff0c;解压kafka压缩包&#xff0c;修改配置文件&#xff1a; kafka_2.13-3.9.0\config\…...