java面试常见笔试题

什么是Redis的持久化

我们知道Redis的数据都存储在内存中,如果服务器突然宕机,那么内存数据将会全部消失,为了防止这种情况出现,利用一套机制来保证数据不会因为故障而丢失,我们将这种机制称之为Redis的持久化机制,该机制主要目的是将内存数据存入到硬盘

Redis 提供两种持久化机制RDB(Redis DataBase)和AOF(Append-Only File)机制。

RDB-快照

快照是最简单的Redis持久化模式,也就是生成某个时间点的数据集,生成RDB文件,可以看到RDB文件中的数据是非常紧凑的,所以在恢复数据的时候读取也是非常快的

RDB文件

触发RDB快照的方式有两种

手动触发

通过手动执行bgsave/save,显示触发生成快照

  • save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存 比较大的实例会造成长时间阻塞,线上环境不建议使用

  • bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子 进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短

配置参数自动触发

自动触发有以下几种情况:

  • 使用save相关配置,命令save m n。表示m秒内数据集存在n次修改时,自动触发bgsave
  • 从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件发送给从节点
  • 执行debug reload命令重新加载Redis时,自动触发save命令
  • 执行shutdown命令时,如果没有开启AOF持久化功能自动执行bgsave

注意:在RDB持久化的过程中有两个问题需要考虑

  1. RDB快照过程中Redis是否会停止对外提供服务
  2. 如果没有停止服务,如何处理新的请求

针对上述问题我们先看一下RDB的持久化执行流程

RDB持久化过程

根据上图我们可以看到主线程主要是fork一个子线程来进行持久化操作,同时父子线程会共享一个数据区域,而且该区域设置为read-only方式,该方式下读的时候没有问题,但是写的时候会触发copyonwrite机制来进行,接下来我们看看什么是 COW(Copy On Write) 机制 。

COW(Copy On Write) 机制

COW(Copy On Write) 机制属于操作系统处理多进程下的一种机制,Redis在持久化的时候会调用glibc函数fork一个子进程。父子进程会共享内存里面的代码段和数据段。

所以持久化的时候是完全交给子进程,而父进程继续处理客户端请求,所以在持久化的时候操作系统采用COW机制进程数据段页面的分离。数据段是由很多操作系统的页面组合而成,当父进程对其中一个页面进行数据修改的时候,先将被父子线程共享的这一个页面复制并分离出来,然后直接对复制的页面进程修改,而此时子进程对应的页面是没有修改的。

Redis采用该机制的简单流程如下。Lunix在fork之后,操作系统会将父进程的所有内存也权限设置为read-only,然后子进程的地址空间指向父进程。当父进程只读时没有问题,当有写内存时,CPU硬件检测到内存也是read-only,于是会触发页异常中断(page-fault),陷入到操作系统的一个中断例程。中断例程中,操作系统采用cow机制会触发异常的也复制一份,于是父子进程各自持有独立的一份,如果这个时候又大量写入操作,会产生大量的分页错误(页异常中断page-fault),从而触发cow机制。

之所以称之为快照也就是说在子进程创建的那一时刻开始。内存的数据就固定下来了,不会发生变化。

RDB的优缺点
优点:
  1. 性能最大化,fork子进程来完成写操作,让主进程继续处理命令,保证了redis的高性能
  2. 重启恢复数据的时候。数据量比较大时候,Redis直接解析RDB二进制文件,生成对应的数据存储在内存中,比AOF的启动效率更高
缺点
  1. 数据安全性低,因为是间隔一段时间进行持久化,如果在持久化之间发生了故障,会丢失数据,这也就决定了该方式更适合在数据要求不严谨的时候采用
  2. 系统性能耗费,根据上文提到的Redis执行cow机制时,可以看到大量的分页错误会耗费不少性能在复制上

AOF(Append Only File - 仅追加文件)

根据上文,快照在某些情况下不是可行的选择,所以AOF很好的支持了。

AOF 原理

该方式非常简单:也就是修改内存的操作命令都会记录下来,加入AOF日志记录都是Redis实例创建以来的所有修改性指令序列,所以恢复也就是顺序执行所有执行。

Redis使用单线程相应命令,如果每次写AOF文件命令都追加到硬盘,会极大地影响处理性能,所以Redis会先写入到aof缓冲区,根据用户配置的同步硬盘策略写入到aof文件中,这个策略可以通过appendfsync参数配置

  • always:每一次写操作都会调用一次fsync,这时数据是最安全的,当然,由于每次都会执行fsync,所以其性能也会受到影响
  • no:Redis不会主动调用fsync去将AOF日志内容同步到磁盘,所以这一切就完全依赖于操作系统的调试了。对大多数Linux操作系统,是每30秒进行一次fsync,将缓冲区中的数据写到磁盘上。
  • everysec:Redis会默认每隔一秒进行一次fsync调用,将缓冲区中的数据写到磁盘。但是当这一次的fsync调用时长超过1秒时。Redis会采取延迟fsync的策略,再等一秒钟。也就是在两秒后再进行fsync,这一次的fsync就不管会执行多长时间都会进行。这时候由于在fsync时文件描述符会被阻塞,所以当前的写操作就会阻塞。

注意,这也是影响Redis性能的参数之一,建议采用 appendfsync everysec(缺省方式)

AOF重写

所谓重写,Redis在长期运行过程中日志会越来越大,在恢复的时候会非常好使,所以我们的目的就是对日志做瘦身

会从以下几点做瘦身:

  1. 无效命令可以删除,比如del key1、hdel key2、srem keys、set a111、set a222等,直接用最终的数据生成命令保存下来就行
  2. 多条命令可以删除,如:lpush list a、lpush list b、lpush list c可以转化为:lpush list a b c
  3. 等等,就不列举了

Redis使用bgrewriteaof指令做瘦身,主要也是开辟一个子进程对内存遍历转化为一系列指令,并序列化到新的文件中,接下来再将操作期间的增量AOF日志追加到新的日志文件中,最终替换了旧的。

AOF重写机制两种方式触发

  1. 手动触发:bgrewriteaof指令
  2. 自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机
  • auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认为64MB。

  • auto-aof-rewrite-percentage:代表当前AOF文件空间 (aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的比值。

auto-aof-rewrite-min-size    100auto-aof-rewrite-percentage  64mb复制代码

如上代表AOF文件的大小小于64mb(默认值),且当前AOF文件大小比基准大小增长了100%时会触发。

AOF优缺点
优点

数据安全,aof持久化配置appendfsync属性,有always,每执行一次命令操作就记录到aof文件一次

缺点

数据集大的时候,比如RDB启动效率低

混合持久化(Redis 4.0版本)

我们根据上文知道,RDB恢复会存在大量数据,AOF恢复性能又较慢,所以在Redis4.0中,采用混合持久化,将RDB文件内存和增量的AOF日志文件放在一起,这里的AOF日志不再是全量日志。而是自持久化开始到持久化结束的这段时间的增量日志,通常较小,重启效率因此大幅得到提升

加载的时候,首先会识别AOF文件是否以REDIS字符串开头,如果是就按照RDB格式加载,加载完成后继续按AOF加载剩余的部分

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

小编在这里分享些我自己平时的学习资料,由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

开源分享:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】

程序员代码面试指南 IT名企算法与数据结构题目最优解

这是” 本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一-痛点, 本书选取将近200道真实出现过的经典代码面试题,帮助广“大程序员的面试准备做到万无一失。 “刷”完本书后,你就是“题王”!

image.png

《TCP-IP协议组(第4版)》

本书是介绍TCP/IP协议族的经典图书的最新版本。本书自第1版出版以来,就广受读者欢迎。

本书最新版进行」护元,以体境计算机网络技不的最新发展,全书古有七大部分共30草和7个附录:第一部分介绍一些基本概念和基础底层技术:第二部分介绍网络层协议:第三部分介绍运输层协议;第四部分介绍应用层协议:第五部分介绍下一代协议,即IPv6协议:第六部分介绍网络安全问题:第七部分给出了7个附录。

image.png

Java开发手册(嵩山版)

这个不用多说了,阿里的开发手册,每次更新我都会看,这是8月初最新更新的**(嵩山版)**

image.png

MySQL 8从入门到精通

本书主要内容包括MySQL的安装与配置、数据库的创建、数据表的创建、数据类型和运算符、MySQL 函数、查询数据、数据表的操作(插入、更新与删除数据)、索引、存储过程和函数、视图、触发器、用户管理、数据备份与还原、MySQL 日志、性能优化、MySQL Repl ication、MySQL Workbench、 MySQL Utilities、 MySQL Proxy、PHP操作MySQL数据库和PDO数据库抽象类库等。最后通过3个综合案例的数据库设计,进步讲述 MySQL在实际工作中的应用。

image.png

Spring5高级编程(第5版)

本书涵盖Spring 5的所有内容,如果想要充分利用这一领先的企业级 Java应用程序开发框架的强大功能,本书是最全面的Spring参考和实用指南。

本书第5版涵盖核心的Spring及其与其他领先的Java技术(比如Hibemate JPA 2.Tls、Thymeleaf和WebSocket)的集成。本书的重点是介绍如何使用Java配置类、lambda 表达式、Spring Boot以及反应式编程。同时,将与企业级应用程序开发人员分享一些见解和实际经验,包括远程处理、事务、Web 和表示层,等等。

image.png

JAVA核心知识点+1000道 互联网Java工程师面试题

image.png

image.png

企业IT架构转型之道 阿里巴巴中台战略思想与架构实战

本书讲述了阿里巴巴的技术发展史,同时也是-部互联网技 术架构的实践与发展史。

image.png

片转存中…(img-70KfIMG1-1710279006996)]

[外链图片转存中…(img-kHdbUqus-1710279006998)]

企业IT架构转型之道 阿里巴巴中台战略思想与架构实战

本书讲述了阿里巴巴的技术发展史,同时也是-部互联网技 术架构的实践与发展史。

[外链图片转存中…(img-hdTVTF6z-1710279006999)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 28
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值