当前位置: 首页 > 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 上安装…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...

CSS3相关知识点

CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...

轻量级Docker管理工具Docker Switchboard

简介 什么是 Docker Switchboard &#xff1f; Docker Switchboard 是一个轻量级的 Web 应用程序&#xff0c;用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器&#xff0c;使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...