面试官:今天聊聊Redis持久化机制吧?

一文讲透 Redis 持久化:RDB、AOF、混合模式该怎么选? Redis 不止是缓存神器,更是面试中的高频考点!很多人知道它快,却忽略了“掉电不丢数据”的秘密。本篇,小米用最通俗的故事,带你彻底搞懂 Redis 持久化机制、优缺点、场景选择与扩容策略,让你面试不再慌! 阅读详情

面试官:今天要不来聊聊Redis的持久化机制吧?

候选者:嗯,没问题的

候选者:在上一次面试已经说过了Redis是基于内存的

候选者:假设我们不做任何操作,只要Redis服务器重启(或者中途故障挂掉了),那内存的数据就会没掉

候选者:我们作为使用方,肯定是不想Redis里头的数据会丢掉

候选者:所以Redis提供了持久化机制给我们用,分别是RDB和AOF

候选者:RDB指的就是:根据我们自己配置的时间或者手动去执行BGSAVE或SAVE命令,Redis就会去生成RDB文件

候选者:这个RDB文件实际上就是一个经过压缩的二进制文件,Redis可以通过这个文件在启动的时候来还原我们的数据

候选者:而AOF则是把Redis服务器接收到的所有写命令都记录到日志中

候选者:Redis重跑一遍这个记录下的日志文件,就相当于还原了数据

面试官:那我就想问了,你上次不是说Redis是单线程吗

面试官:那比如你说的RDB,它会执行SAVE或BESAVE命令,生成文件

面试官:那不是非常耗时的吗,那如果只有一个线程处理,那其他的请求不就得等了?

候选者:嗯,没错,Redis是单线程的。

候选者:以RDB持久化的过程为例,假设我们在配置上是定时去执行RDB存储

候选者:Redis有自己的一套事件处理机制,主要处理文件事件(命令请求和应答等等)和时间事件(RDB定时持久化、清理过期的Key等的)

候选者:所以,定时的RDB实际上就是一个时间事件

候选者:线程不停地轮询就绪的事件,发现RDB的事件可执行时,则调用BGSAVE命令

候选者:而BGSAVE命令实际上会fork出一个子进程来进行完成持久化(生成RDB文件)

候选者:在fork的过程中,父进程(主线程)肯定是阻塞的。

候选者:但fork完之后,是fork出来的子进程去完成持久化。处理请求的进程该干嘛的就干嘛

候选者:所以说啊,Redis是单线程,理解是没错的,但没说人家不能fork进程来处理事情呀,对不对

候选者:还有就是,其实Redis在较新的版本中,有些地方都使用了多线程来进行处理

候选者:比如说,一些删除的操作(UNLINK、FLUSHALL ASYNC等等)还有Redis 6.x 之后对网络数据的解析都用了多线程处理了。

候选者:只不过,核心的处理命令请求和响应还是单线程。

面试官:那AOF呢?AOF不是也要写文件吗?难道也是fork 了个子进程去做的?

候选者:emm,不是的。AOF是在命令执行完之后,把命令写在buffer缓冲区的(直接追加写)

候选者:那想要持久化,肯定得存盘嘛。Redis提供了几种策略供我们选择什么时候把缓冲区的数据写到磁盘

候选者:我记得有:每秒一次/每条命令都执行/从不存盘;一般我们会选每秒一次

候选者:Redis会启一个线程去刷盘,也不是用主线程去干的

面试官:那如果把执行过的命令都存起来

面试官:等启动的时候是可以再把这些写命令再执行一遍,达到恢复数据的效果

面试官:这样会有什么样的问题吗?

候选者:嗯,问题就是,如果这些写入磁盘的「命令集合」不做任何处理,那该「命令集合」就会一直膨胀

候选者:其实就是该文件会变得非常大

候选者:Redis当然也考虑了这一点,它会fork个子进程会对「原始」命令集合进行重写

候选者:说白了就是会压缩,压缩完了之后只要替换原始文件就好了

面试官:那我又想问了,既然它是fork一个进程来对AOF进行重写的

面试官:前面你也提到了再fork时,主进程是阻塞的,但fork后,主进程会继续接收命令

面试官:你是说重写完(压缩)会进行文件覆盖

面试官:那这样不会丢数据吗?毕竟主进程在fork之后是一直会接收命令的

候选者:哦,我明白你的意思了。

候选者:其实做法很简单啊,在fork子进程之后,把新接收到命令再写到另一个缓冲区不就好了吗

面试官:可以

面试官:那AOF和RDB用哪一个呢?

候选者:主要是看业务场景吧,我们这边是基于Redis自研了一套key-value存储

面试官:自研的?你们的Redis架构是什么?

候选者:别别别,当我没说。就是开源的,开源的。我们回到RDB和AOF上吧。

候选者:在新增namespace(实例) 的时候也会让你选择对应的使用场景

候选者:就是会让你通过不同的应用场景进行配置选择

候选者:比如说,业务上是允许重启时部分数据丢失的,那RDB就够用了(:

候选者:RDB在启动的时候恢复数据会比AOF快很多

候选者:在Redis4.0以后也支持了AOF和RDB混合

候选者:在官网是不建议仅仅只使用AOF的,如果对数据丢失容忍度是有要求的,建议是开启AOF+RDB一起用

候选者:总的来说,不同的场景使用不同的持久化策略吧

面试官:了解

面试官:顺便我想问下,假如Redis的内存满了,但业务还在写数据,会怎么样?

候选者:嗯,这个问题我也遇到过

候选者:一般来说,我们会淘汰那些「不活跃」的数据,然后把新的数据写进去

候选者:更多情况下,还是做好对应的监控和容量的考量吧

候选者:等容量达到阈值的时候,及时发现和扩容

面试官:你这懂得有点多啊

本文总结:

  • Redis持久化机制:RDB和AOF
  • RDB持久化:定时任务,BGSAVE命令 fork一个子进程生成RDB文件(二进制)
  • AOF持久化:根据配置将写命令存储至日志文件中,顺序写&&异步刷盘(子线程),重写AOF文件也是需要 fork 子进程。Redis4.0之后支持混合持久化,用什么持久化机制看业务场景

【对线面试官-移动端】系列 一周两篇持续更新中!

【对线面试官-电脑端】系列 一周两篇持续更新中!

原创不易!!求三连!!

谢飞机的Java面试奇遇记:从HashMap到Redis的搞笑面试之旅 面试官:你好,谢飞机,欢迎来参加我们的Java开发岗位面试。我们今天会围绕Java核心技术、JUC、JVM、多线程、线程池、HashMap、ArrayList、Spring、SpringBoot、MyBatis、Dubbo、RabbitMQ、xxl-job、Redis、MySQL、Linux、Docker、设计模式、DDD等内容进行提问。准备好了吗?谢飞机:准备好了,大不了回家等通知! 阅读详情

相关推荐

为什么我的Win11家庭版找不到BitLocker?教你两种强制关闭加密的隐藏方法

本文解释了Win11家庭版为何缺少BitLocker功能,并提供了两种强制关闭加密的隐藏方法。通过注册表修改和PowerShell命令,用户可以调出隐藏的加密控制面板或直接操控加密引擎,解决家庭版设备加密的管理难题。

weixin_42535703的博客 1759

《对线面试官》Redis 主从架构

主服务器发现这是一个新的从服务器(因为参数没带上来),就会采用「完全重同步」模式,并把「服务器ID」(runId)和「复制进度」(offset)发给从服务器,从服务器就会记下这些信息。可以简单理解为如果是第一次「同步」,从服务器没有复制过任何的主服务器,或者从服务器要复制的主服务器跟上次复制的主服务器不一样,那就会采用「完全重同步」模式进行复制。然后从服务器就会发「PSYNC」命令给主服务器,要求同步(这时会带「服务器ID」RUNID和「复制进度」offset参数,如果从服务器是新的,那就没有)...

m0_72885838的博客 146

C++面向对象程序设计大作业:魔兽世界(三):开战

C++面向对象程序设计大作业:魔兽世界(三):开战问题描述问题分析代码 问题描述 问题来自于北京大学郭炜老师的C++慕课的大作业 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市,城市从西向东依次编号为1,2,3 … N ( N <= 20)。红魔军的司令部算作编号为0的城市,蓝魔军的司令部算作编号为N+1的城市。司令部有生命元,用于制造武士。 两军的司令部都会制造武士。武士一共有dragon 、ninja、iceman、lion、wolf 五种。每种武士都有

RedRum_1965的博客 4036

《对线面试官》| 高频 Redis 面试题(上)

进来给我学 Redis 面试题!

s_alted的博客 708

深入解析:如何基于开源p-net快速开发Profinet从站服务

开源p-net协议栈为工业设备开发者打开了通往Profinet世界的大门。随着工业互联网的发展,软协议栈方案将在边缘计算领域展现更大潜力。该文章完整实现了PROFINET从站的核心功能,可直接作为产品开发的基础框架。实际部署时需根据具体硬件平台调整网络驱动和实时性配置。

极地星辰 3879

Pytorch学习笔记(III)——提取特征

目录一、引言二、具体步骤1、参数模型2、网络结构3、参数载入4、特征提取器5、读取图片三、完整代码 一、引言   深度学习在许多任务中主要充当着特征学习的作用,而学习完的特征才是后续应用的一个关键。本文将主要介绍,如何提取任意目标层的特征图。   本文以输入数据为图片为例。 二、具体步骤 1、参数模型 博主使用了ResNet50训练了一个人脸识别的网络   训练完成的深度学习模型,我们会保存一...

lockonlxf的博客 2643

redis:redis内存满了怎么办

实际上redis定义了【八种内存淘汰策略】来处理redis内存满的情况 1.noeviction:直接返回错误,不淘汰任何已经存在的redis键 2.allkeys-lru:所有的键使用lru算法进行淘汰 3.volatile-lru:有过期时间的使用lru算法进行淘汰 4.allkeys-random:随机删除redis键 5.volatile-random:随机删除有过期时间的redis键 6.volatile-ttl:删除快过期的redis键 7.volatile-lfu:根据lfu算法从有过期时间的

OceanStar的博客 8298

ONFI5.0命令字实战指南:从基础操作到高级应用

本文深入解析ONFI5.0协议的核心——命令字,提供从基础操作到高级应用的实战指南。详细拆解了NAND闪存的复位、读状态、数据读取(00-30)、页编程(80-10)和块擦除(60-D0)等关键命令周期,并探讨了多平面操作与缓存操作等高级性能优化技巧,帮助开发者高效、稳定地与NAND芯片进行底层交互。

vscode5coder的博客 462

Redis无磁盘化复制原理解析、Redis 缓存过期处理与内存淘汰机制

一、Redis无磁盘化复制原理解析 从内存复制到内存,用socket传输。磁盘不好时,网络带宽性能好时,可以选择无磁盘化复制。无磁盘化复制目前处在试验阶段。 配置 repl-diskless-sync yes //开启无磁盘化复制 repl-diskless-sync-delay 5 //等待5秒钟,再开始无磁盘化同步,目的是等待所有slave服务器都连接上master服务(socket通信) 二、Redis 缓存过期处理 引子 计算机内存有限,越大越贵,Redis的高并发高...

qq_39750835的博客 863

谷粒商城 - 个人笔记(集群部署篇一)

电商后台管理系统+电商系统,掌握微服务的全套方案。该系统有商品服务、仓储服务、订单服务、购物车服务、检索服务、认证中心服务、网关服务、用户服务、秒杀服务、第三方服务。使用SpringBoot+SpringCloud并配套SpringCloud Alibaba系列,引入全套微服务治理方案:Nacos注册中心/配置中心、Feign远程调用、Gateway网关、Redisson缓存、基于ElasticSearch7全文检索、异步编排与线程池、RabbitMQ柔性事务方案、Redisson分布式锁、分布式信号量等。

知行 4000

高斯过程的数学理解

G澳大利亚的过程是有益的,特别是当我们有少量数据时。当我在制造业担任数据科学家时,我们的团队使用这种算法来揭示我们接下来应该进行哪些实验条件。但是,此算法不如其他算法流行。在这篇博客中,我将通过可视化和 Python 实现来解释高斯过程 [1] 的数学背景。

gongdiwudu的专栏 3606

面试题:Redis的持久化机制是什么?各自的优缺点?

Redis的持久化机制是什么?各自的优缺点? Redis提供两种持久化机制RDB和AOF机制: 1)RDB(Redis DataBase)持久化方式: 是指用数据集快照的方式(半持久化模式)记录redis数据库的所有键值对,在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。 优点:    1.只有一个文件dump.rdb,方便持久化。  ...

qq_29860591的博客 478

2023年全国青少年信息素养大赛C++编程初中组决赛真题+答案解析

2023年全国青少年信息素养大赛C++编程初中组决赛真题+答案解析

伶俐角少儿编程 818

面试官:今天要不来聊聊Redis的持久化机制吧?

面试官:今天要不来聊聊Redis的持久化机制吧? 候选者:嗯,没问题的 候选者:在上一次面试已经说过了Redis是基于内存的 候选者:假设我们不做任何操作,只要Redis服务器重启(或者中途故障挂掉了),那内存的数据就会没掉 候选者:我们作为使用方,肯定是不想Redis里头的数据会丢掉 候选者:所以Redis提供了持久化机制给我们用,分别是RDB和AOF 候选者:RDB指的就是:根据我们自己配置的时间或者手动去执行BGSAVE或SAVE命令,Redis就会去生成RDB文件 候选者:这个R.

分享Java技术知识,共同成长进步! 139

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

面试官:谢飞机,聊聊Redis分布式锁?

下一位,谢飞机!”面试官推了推眼镜,面无表情地喊道。谢飞机整理了下皱巴巴的格子衬衫,快步走进会议室,脸上堆满了自信的笑容:“面试官好!我就是那个写了10年代码,精通所有技术栈的男人!面试官瞥了一眼简历,嘴角微微抽搐:“好的,那我们开始吧。

weixin_69967800的博客 827

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Redis基础面试题:Redis中的多线程I/O模型与持久化机制(RDB与AOF)在高并发场景下的性能优化与实现原理

面试官你对Redis的理解非常透彻。Victor面试在愉快的氛围中结束了。

qq_61302385的博客 4397

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Redis基础面试题:Redis中的持久化机制(RDB与AOF)及其在高并发场景下的性能优化策略

面试官:今天的讨论非常深入。最后,能否总结一下Redis持久化机制的核心要点?RDB通过快照保存数据,适合备份和快速恢复,但可能会丢失部分数据。AOF通过记录命令保证数据安全,适合高可靠性场景,但文件较大且恢复较慢。结合使用RDB和AOF可以兼顾性能和数据安全性。高并发优化需要从配置、硬件和架构多个维度进行权衡。

qq_61302385的博客 767

Redis基础面试题:Redis中的持久化机制(RDB与AOF)与多线程I/O模型在高并发场景下的性能优化与实现原理

面试官:今天我们对Redis的持久化机制和多线程I/O模型进行了深入的讨论。你对这些技术点有什么总结吗?RDB和AOF是Redis两种互补的持久化机制,RDB适合备份和快速恢复,而AOF适合数据安全性要求高的场景。多线程I/O模型通过分担网络I/O任务提高了Redis在高并发场景下的性能,但核心逻辑仍然是单线程的。在实际应用中,需要根据业务需求选择合适的持久化机制和配置参数,以达到最佳的性能和数据安全性平衡。

qq_61302385的博客 729

Redis面试18问,看完,把面试官按在地上暴打摩擦!

候选者:嗯,没问题的候选者:主服务器要复制数据到从服务器,首先是建立Socket「连接」,这个过程会干一些信息校验啊、身份校验啊等事情候选者:然后从服务器就会发「PSYNC」命令给主服务器,要求同步(这时会带「服务器ID」RUNID和「复制进度」offset参数,如果从服务器是新的,那就没有)候选者:可以简单理解为:如果是第一次「同步」,从服务器没有复制过任何的主服务器,或者从服务器要复制的主服务器跟上次复制的主服务器不一样,那就会采用「完全重同步」模式进行复制。

bjmsb79的博客 71

Redis面试实录:面试官VS水货程序员谢飞机的技术对决

谢飞机,我们先从Redis的基础数据结构开始。请你说说Redis常用的数据结构有哪些?:啊,这个我知道!有String、List、Set、Hash、Zset...还有那个什么Stream?反正就是这些啦!:不错,回答正确。那你能说说String类型在什么业务场景下使用比较合适吗?:String啊,就是存字符串嘛!比如用户信息、商品信息,反正就是存东西的地方。:那Hash和String有什么区别?在什么情况下选择Hash更合适?:呃...Hash就是多个String放在一起?

m0_73689466的博客 953

Java大厂面试实战:严肃面试官与搞笑程序员的面试记 - Java SE, Spring Boot, Redis, Spring Cloud技术栈

Java 8引入的Lambda表达式可以简化函数式编程,Stream API提供了丰富的操作集合的API,新的日期时间API(java.time包)更加灵活和易用,Optional类用于处理null值,避免NullPointerException。String用于存储字符串,List用于存储列表,Set用于存储集合,Hash用于存储哈希表,ZSet用于存储有序集合。Hystrix的断路器会监控服务调用的失败率,当失败率达到一定阈值时,断路器会自动切换到打开状态,后续的请求会立即失败,不再发送到服务端。

qq_32087723的博客 972

Java面试记:谢飞机的搞笑求职之旅(Spring Boot, Kafka, Redis)

啊,这个嘛... 我知道Kafka是分布式的消息队列,Producer负责发送消息,Consumer负责接收消息,然后还有Topic和Partition的概念。:呃... 消费者组的话,不同的消费者可以共享一个Group ID,然后每个分区只能被一个消费者消费,这样就能实现负载均衡了。:这个我知道,它是用来启用Spring Boot的自动配置功能的,会根据classpath中的依赖和配置来决定加载哪些组件。:最后一个话题,假设你在做一个直播平台,主播发布视频流,观众订阅观看,你会用什么技术栈实现?

sinat_26229211的博客 949

面试官:Redis分布式锁超时了,任务还没执行完怎么办?

做一个单纯的程序圆,分享干货,聊聊人生。 今天主要分享的是面试中常见的redis的一些面试内容。如果你正好需要刚好可以帮你回顾一下,如果不需要可以收藏起来后面用到的时候翻出来回顾。 一、背景 面试官:你们项目中有使用分布式锁么? 我:有使用。 面试官:你们使用分布式锁主要是为了干啥? 我:多节点并发访问同一份数据的时候,防止造成脏数据。 面试官:都有哪些方案实现分布式锁?你们用的是哪一种? 我:有基于zk的临时顺序节点的方案,有redis的setnx和指定expire超时时间的方案。 面试

yangjnsjbad的博客 2322

Java面试避坑指南:那些年我们答错的Redis持久化与MySQL索引问题

本文通过Docker环境实战,深入解析Java面试中Redis持久化与MySQL索引的高频陷阱。重点探讨AOF配置误区、数据恢复机制,以及MySQL索引B+树原理与失效场景,帮助开发者从原理到实操,提升面试应对能力。

silver的专栏 793
上一篇: 面试官问我Map接口,我
下一篇: CountDownLatch和CyclicBarrier区别
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值