首页 > 数据库 >《面试1v1》Redis持久化

《面试1v1》Redis持久化

时间:2023-06-18 18:36:55浏览次数:44  
标签:AOF 持久 Redis 面试 RDB 进程 重写 1v1


《面试1v1》 连载中...


面试官: 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》Redis持久化_持久化

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


《面试1v1》 连载中...


标签:AOF,持久,Redis,面试,RDB,进程,重写,1v1
From: https://blog.51cto.com/wangshiyu/6509120

相关文章

  • Redis - 数据结构类型及使用场景详解
    一.简介Redis是由SalvatoreSanfilippo编写的一个key-value存储系统,是跨平台的非关系型数据库。Redis是一个开源的,使用C语言编写的,遵守BSD协议,支持网络,可基于内存,分布式,可选持久性的键值对(key-value)存储数据库,并且提供了多种语言的API。二.特性1.基于内存存储(不开启持久化的......
  • Redisson分布式锁和同步器详解-官方原版
    一、锁定基于Redis的Java分布式可重入锁对象,并实现了锁接口。如果获取锁的Redisson实例崩溃,则此类锁可能会在获取状态下永久挂起。为了避免这种Redisson维护锁watchdog,当锁持有者Redisson实例处于活动状态时,它会延长锁的到期时间。默认情况下,lockwatchdog超时为30秒,可以通过Config......
  • Java集合框架常见面试题
    剖析⾯试最常⻅问题之Java集合框架集合概述Java集合概览从下图可以看出,在Java中除了以Map结尾的类之外,其他类都实现了Collection接⼝。并且,以Map结尾的类都实现了Map接⼝。说说List,Set,Map三者的区别?List(对付顺序的好帮⼿):存储的元素是有序的、可重复的......
  • Redis的设计与实现-总结
    个人真的很喜欢这本书,从对C语言一窍不通,到发现C语言竟然如此简洁,以至于我喜欢上了C!对此前面的底层数据结构也读了几次,大致整理了书里的内容,后面的就粗略看了一下,不再细细整理了.Redis的设计与实现(1)-SDS简单动态字符串Redis的设计与实现(2)-链表Redis的设计与实......
  • springboot中操作redis
    1.maven引入相关依赖<dependencies> <!--spring-boot-starter-data-redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId&g......
  • java操作redis之jedis
    我们之前对Redis的学习都是在命令行窗口,那么如何使用Java来对Redis进行操作呢?对于Java连接Redis的开发工具有很多,这里先介绍通过Jedis实现对Redis的各种操作。(前提是你的redis已经配置了远程访问)1.创建一个maven工程,并且添加以下依赖<dependencies><!--jedis--><......
  • 申威3231服务器Redis性能验证-及最全信创CPU性能分析
    申威3231服务器Redis性能验证-及最全信创CPU性能分析背景公司里面新进了几台服务器.有台申威服务器.因为前段时间参与过一次申威的POC验证.当时对性能有一点简单的理解.但是因为不方便,没有测试更多.这次有了一台实体机器,并且可以上网,所以感觉可以方便的多了.本来想使用......
  • 金仕达笔试面试心得
    1.笔试金仕达笔试由五道逻辑题、十道选择题和十道填空题对于逻辑题是压根没想到,十道选择题和十道填空题比较简单,都是Java基础知识2.面试2.1Java相对于C++优势在哪?我的回答:JVM执行字节码文件,跨平台(writeoncerunaway);没有指针等复杂内容;成型框架和生态圈比较多,可以快速寻找和解决......
  • Redis
    一、前言​ Windows和Linux的压缩包都放在这里了,都是5.0.14版本,应该就够用。二、NOSQL简介(一)关系型数据库​ 在一个给定的应用领域中,所有实体及实体之间联系的集合构成一个关系数据库。关系数据库的型称为关系数据库模式,是对关系数据库的描述,若干域的定义,在这些域上定......
  • Redis特殊类型之Geospatial
    1.概述redis除了提供了五大基本数据类型String、List、Set、Hash、Zset,还有3个比较特殊的数据类型,Geospatial、Hyperloglog、Bitmap,这三个数据类型有一些比较有趣的应用场景,下面说说Geospatial,主要可以应用于跟地图相关的应用。朋友的定位,附近的人,打车距离计算?Redis的Geo在Redis......