《面试1v1》Redis持久化

news2024/12/26 12:39:18

🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪
🍅 技术交流:定期更新Java硬核干货,不定期送书活动
🍅 王哥多年工作总结:Java学习路线总结, 点击 突击面试
🍅 数十万人的面试选择: 面试说人话系列《面试1v1》

在这里插入图片描述

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。


《面试1v1》 连载中…


我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。

面试官: Redis是内存数据库,数据存放在内存中,当Redis服务重启数据会丢失,那么Redis如何保证数据的持久化?

候选人: Redis 提供两种持久化方案:RDB(Redis DataBase)和AOF(Append Only File)。

面试官: 说说RDB吧,它的工作原理是什么?

候选人: RDB的工作原理很简单,就是在指定的时间间隔内将内存中的数据集快照写入磁盘,恢复时是将快照文件直接读入内存。

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程仍然处理客户端请求,这样可以保证RDB过程不影响服务。
RDB的优点是轻量,适合大规模的数据恢复;缺点是数据有一定的丢失风险,持久化的工作并不实时。

面试官: 那AOF又是什么?

候选人: AOF的全称是Append Only File,它的工作原理是:

将每次执行会改变数据库的命令记录下来,并追加到AOF文件中。AOF文件就是一个命令的记录,Redis重启时会重新执行AOF文件中的命令来恢复数据。

AOF的优点是每次修改都会同步到磁盘,有效防止数据丢失;缺点是AOF rewrite的时候会阻塞客户端查询,并且文件会变得越来越大。

Redis提供了AOF重写机制,可以彻底压缩AOF文件体积,用一条等价的命令代替多条之前的命令。AOF重写也采用fork方式进行,不会影响应用的访问。

面试官: AOF重写的机制原理能详细说下么?

候选人: AOF重写的基本流程是:

  1. 子进程创建:主进程fork一个子进程,负责重写工作。
  2. 子进程载入当前数据库快照,并开始解析AOF文件。
  3. 子进程构建新的AOF,仅记录数据库里面和快照不同的键。
  4. 子进程完成后,将新构建的AOF发送给主进程。
  5. 主进程加载新AOF,替换旧AOF。如果AOF加载失败,继续使用旧AOF。
  6. 子进程退出。

该机制可以保证主进程始终可用,不会阻塞客户端请求。新旧AOF文件替换采用原子性rename操作,防止重启时只部分加载新AOF的情况发生。
主要的源码在rewriteAppendOnlyFile方法中:

void rewriteAppendOnlyFile(void) {
    int fd;
    char tmpfile[256];
    redisDb *db = server.db;

    /* 创建子进程 */
    if (server.child_type == REDIS_CHILD_TYPE_AOF) {
        ...
    }  

    /* 载入当前数据库 */
    emptyDb(-1);
    if (rdbSave(tmpfile) != REDIS_OK) {
        ...
    }  

    /* 构建新AOF */
    fd = open(tmpfile,O_WRONLY|O_APPEND|O_CREAT,0644);
    /* 将新AOF发送给主进程 */ 
    atomicReplaceFile(server.aof_filename,tmpfile);  
}

面试官: 讲的很透彻,AOF重写机制我现在全明白了,Redis的持久化方案用的真的很巧妙!

候选人: 是的,Redis的RDB和AOF双持久化方案,既保证了数据的持久性,也兼顾了效率。

在这里插入图片描述

最近我在更新《面试1v1》系列文章,主要以场景化的方式,讲解我们在面试中遇到的问题,致力于让每一位工程师拿到自己心仪的offer,感兴趣可以关注JavaPub追更!


《面试1v1》 连载中…


🎁目录合集:

Gitee:https://gitee.com/rodert/JavaPub

GitHub:https://github.com/Rodert/JavaPub

http://javapub.net.cn

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

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

相关文章

css基础知识七:元素水平垂直居中的方法有哪些?如果元素不定宽高呢?

一、背景 在开发中经常遇到这个问题,即让某个元素的内容在水平和垂直方向上都居中,内容不仅限于文字,可能是图片或其他元素 居中是一个非常基础但又是非常重要的应用场景,实现居中的方法存在很多,可以将这些方法分成…

3.用python写网络爬虫,下载缓存

目录 3.1 为链接爬虫添加缓存支持 3.2 磁盘缓存 3.2.1 实现 3.2.2缓存测试 3.2.3节省磁盘空间 3.2.4 清理过期数据 3.2.5缺点 3.3 数据库缓存 3.3.1 NoSQL 是什么 3.3.2 安装 MangoDB 3.3.3 MongoDB 概述 3.3.4 MongoDB 缓存实现 3.3.5 压缩 3.3.6 缓存测试 3.4 本章…

变分自编码(VAE,Variational Auto-Encoder)知识点速览

目录 1. 主要思想 2. 训练和推理过程 3. 编码器和解码器的结构 4. 主要用途 5. 相较于 auto-encoder 的优劣 1. 主要思想 变分自编码器(Variational AutoEncoder,简称VAE)是一种生成模型,它通过对数据的隐含表示(l…

红日靶场(一)外网到内网速通

红日靶场(一) 下载地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ win7:双网卡机器 win2003:域内机器 win2008域控 web阶段 访问目标机器 先进行一波信息收集,扫一下端口和目录 扫到phpmyadmin,还有一堆…

韶音和cleer、南卡对比哪个好?韶音、南卡、Cleer开放式耳机横评

现如今,不管是通勤路上还是在家休闲娱乐,又或者是运动时,经常能看见很多人佩戴着耳机听音乐,但是,经常佩戴耳机听音乐的小伙伴都知道,入耳式耳机佩戴久了,容易造成耳部酸痛感、胀痛感&#xff0…

Android 安卓开发语言kotlin与Java该如何选择

一、介绍 如今在Android开发中,应用层开发语言主要是Java和Kotlin,Kotlin是后来加入的,主导的语言还是Java。kotlin的加入仿佛让会kotlin语言的开发者更屌一些,其实不然。 有人说kotlin的引入是解决开发者复杂的逻辑,并…

【VSCode】设置关键字高亮的插件 | Highlight Word

目录 一、概述二、安装 highlight-words 插件三、配置 highlight-words 插件3.1 默认配置3.2 修改 settings.json 配置文件 四、设置高亮快捷键F8五、效果演示 一、概述 本文主要介绍在 VSCode 看代码时,怎样使某个单词高亮显示,主要通过以下三步实现&am…

Docker的run流程

底层原理 Docker怎么工作? Docker为什么比VM虚拟机块? 1.Docker有比虚拟机更少的抽象层 2.docker利用的是宿主机的内核,vm需要是Guest OS 所以说,新建一个容器的时候,docker不需要像虚拟机一样加载一个系统内核&am…

[conda]tf_agents和tensorflow-gpu安装傻瓜式教程

1.打开终端或Anaconda Prompt&#xff08;Windows用户&#xff09;。 2.输入以下命令创建新的Python环境&#xff1a; conda create --name <env_name> python<version>其中&#xff0c;<env_name>是您想要创建的环境名称&#xff0c;<version>是您想…

保留纵向连续性的迭代次数估算方法

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有3个节点&#xff0c;训练集AB各由5张二值化的图片组成&#xff0c;让B全是0&#xff0c;让差值结构中有6个1.其中有3组 差值结构 A-B 迭代次数 行分布 列分布 0 1 1 0 1 1 3*5*1*2*0-0*0*0*0*0 3977.834 0 1 …

springboot中自定义JavaBean返回的json对象属性名称大写变小写问题

文章目录 springboot中自定义JavaBean返回的json对象属性名称大写变小写问题一、继承类二、手动添加Get方法三、JsonProperty四、spring-boot json(jackson)属性命名策略 springboot中自定义JavaBean返回的json对象属性名称大写变小写问题 开发过程中发现查询返回的数据出现自…

模拟电路系列分享-运放的关键参数3

目录 概要 整体架构流程 技术名词解释 1.输入电压范围 2.优劣范围: 3.理解 技术细节 1.共模抑制比 2.优劣范围 3.理解 小结 概要 提示&#xff1a;这里可以添加技术概要 实际运放与理想运放具有很多差别。理想运放就像一个十全十美的人&#xff0c;他学习100 分&#xff0c;寿…

chatgpt赋能python:Python中的相加功能函数:介绍、应用和示例

Python中的相加功能函数&#xff1a;介绍、应用和示例 Python是一个功能强大的编程语言&#xff0c;拥有许多强大的内置函数和模块。其中一个非常常见的功能是相加或者加法操作。让我们看一下Python中的相加功能函数。 什么是相加&#xff1f; 简而言之&#xff0c;相加是将…

6.17、进程与线程

比如&#xff0c;一边游戏&#xff0c;一边qq聊天&#xff0c;一边听歌&#xff0c;怎么设计&#xff1f; 进程 进程&#xff08;process&#xff09;&#xff1a;程序的一次执行过程&#xff0c;或是正在内存中运行的应用程序。如&#xff1a;运行中的QQ&#xff0c;运行中…

二叉树的基本操作(如何计算二叉树的结点个数,二叉树的高度)

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

内网隧道代理技术(八)之Python 反弹Shell

Python 反弹Shell Python介绍 Python由荷兰数学和计算机科学研究学会的吉多范罗苏姆于1990年代初设计&#xff0c;作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构&#xff0c;还能简单有效地面向对象编程。Python语法和动态类型&#xff0c;以及解释型语言的本…

月薪2万,被新同事15秒气走。

今年&#xff0c;AIGC掀起了巨浪&#xff0c;身边不少人感到前所未有的焦虑&#xff1a; 朋友圈好友晒出的AI美图&#xff0c;仅需15秒&#xff0c;竟比我2周的设计更出色&#xff1b; 公司用AI写的文案&#xff0c;转化率提升了10%&#xff0c;可能要优化人员了; 职场危机提前…

Boost序列化全解析

程序开发中&#xff0c;序列化是经常需要用到的。像一些相对高级语言&#xff0c;比如JAVA, C#都已经很好的支持了序列化&#xff0c;那么C呢&#xff1f;当然一个比较好的选择就是用Boost&#xff0c;这个号称C准标准库的东西。 什么时候需要序列化呢&#xff1f;举个例子&am…

可视化的工时管理:让项目进度真实可见

在现代项目管理中&#xff0c;工时表软件作为一种强大而有效的工具&#xff0c;能够帮助团队更好地管理项目进度。无论是大小型项目&#xff0c;正确使用工时表软件都可以提高团队的效率和项目的可追踪性。本文将介绍一些关键步骤&#xff0c;以帮助企业利用工时表软件来管理项…

【计算机图形学】期末总结大全,建议收藏

文章目录 一、图形学及其研究内容二、图形的输入设备和显示设备三、图形的显示设备四、显示子系统五、图形软件标准五、图形软件包六、习题七、直线段扫描转换算法八、直线段扫描转换算法练习题九、扫描线填充算法十、实区域填充算法十一、反走样技术十二、图形裁剪基础概念十三…