java面试资料整理
还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来。
System.out.println(a==b);
- 上面结果为true,因为JAVA的Integer有IntegerCache会缓存-128~127之间的对象,上面的new Integer(50)会自动调用Integer的valueOf()方法,通过该方法返回一个Integer对象,所以返回的是同一个对象,自然输出的值也为true。但是注意的是如果new的值超过了IntegerCache缓存范围值就为false了
- 2020/07/06
MySQL篇
面试官:你平时开发用的什么数据库啊
小白:平常开发都用的mysql
面试官:那我们就来聊一聊mysql吧。你mysql一般用的什么存储引擎啊?
小白:因为业务需要我们试用的是支持事务的innodb的
面试官:那你知道innodb支持事务主要是怎么实现的么?
小白:是通过innodb特有的redolog,和采用两阶段提交来实现的。
面试官:那你可以说说redolog的理解,和两阶段提交是什么一个过程么?
小白:redolog就是为了防止每次对数据库的一个增删改的操作都去操作磁盘而设立的,也就是redolog节省了有关写的io消耗,而说到两阶段提交就要说说binlog了,binlog是server层的日志文件,记录了整个库的一个增删改的变化,redolog和binlog的区别主要有以下三点:
- 1.redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。
- 2.redo log是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,记录的是这个语句的原始逻辑
- 3.redo log是循环写的,空间固定会用完;binlog是可以追加写入的。“追加写”是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
而所谓的两阶段提交就是将更新操作先记录到redo log里面,此时redo log处于prepare状态。然后告知执行器执行完成了,随时可以提交事务。然后执行器生成这个操作的binlog,并把binlog写入磁盘。在然后执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log改成提交(commit)状态,更新完成
面试官:那你知道为什么要采用两阶段提交么
小白:因为如果不采用两阶段提交的话,无论是先写redolog还是先写binlog,如果在写完一个另一个还没有写完的时候服务crash(崩溃)了,后面根据binlog进行一个数据恢复就会产生数据不一致的问题。
面试官:索引你应该有所了解吧,你知道普通索引和唯一索引在使用的时候应该注意哪些么
小白:这里主要要考虑的是一个对change buffer的一个利用,因为change buffer是可以有效节约读磁盘的消耗的,而如果你一个在非必须的场景下,给一个字段建立了唯一索引,那么对那个字段的操作将不能使用到change buffer,从而浪费大量资源。备注(change buffer用来记录一些对数据库的更新操作,如果对数据库的一个更新操作,是肯定可以成功的,比如插入一条数据(不用去判断插入内容是否违法唯一约束啥的),那么就可以不用去把要操作的数据从磁盘读到内存中,等到下次要查询的时候在进行一个操作,从而达到一个节约读磁盘io操作,如果你那个字段加了唯一索引的话,就必须得读取到内存中进行一次判断,虽然判断消耗得cpu资源很少,但是那个读取得过程是很耗性能得)
面试官:那你在跟我讲讲你建索引要注意哪些事项啊
小白:首先因为innodb采用得聚簇索引,所以对主键得选取尽量采用占用内存小的,其次要利用好mysql建立索引得最左匹配原则来减少回表得一个操作,提升一个查询效率。
面试官:你提到了回表,你和我说说回表是什么意思啊
小白:因为innodb采用得是聚簇索引,只有主键索引(一级索引)才会记录整行得值,而二级索引(非主键索引)只会记录主键得值,也就是如果你查询条件用的是二级索引,而二级索引中保存得信息又不满足要查询得字段,那么就会在根据主键在取主键索引上进行一个查询,这个过程称为回表。通过索引覆盖就可以适当得减少回表得一个现象,从而提升查询效率,索引覆盖就是你建立得二级索引就已经满足你要查询得字段要求了,那样就不需要进行一个回表操作了
面试官:你对mysql得一个sql优化有没有过了解呢
小白: 对于mysql的一个优化,一般都会有一个监控平台对慢sql进行一个监控,也可以通过开启慢查询,设置一些参数来进行一个监控,当知道哪些sql语句是慢sql后,就可以通过explain命令对它的一个执行过程进行一个具体的解析,可以看到查询的一个类型,有没有用到索引,有哪些索引可以选择等等,然后如果是因为没有建索引,就可以创建,如果有索引没有采用的话,就分析一下原因进行一个修改。
Redis篇:
面试官:你日常开发中用到的非关系型数据库是用的哪个啊?
小白:平常开发中采用的是redis的。因为它有着丰富的数据结构,和十分给力的操作速度每秒读11万次,写8万次每秒。
面试官:那redis中常用的数据类型有哪些啊?
小白:常用的有五种:String,List,Set,ZSet,Hash,然后还有三种使用比较少的,GEO,hyperloglog,bitmap。
面试官:那你都知道他们的使用场景么,比如最常用的String?
小白:String类型常用做计数器,和分布式锁中
面试官:那你提到了分布式锁,那redis对分布式锁是怎么实现的呢?
小白:主要使用的是两个命令,一个setnx:如果key不存在在进行一个设置,还有一个expire:给一个key设置过期时间,用于如果一个线程跑的过程挂了,没有自己去释放锁,那么redis会进行一个自动释放。
面试官:如果你通过两条命令去进行一个锁的设置,是无法保证原子性的吧,这种情况你怎么处理?
小白:setnx和expire命令是可以当作set命令的参数进行整合的,那样整合成一条命令就能保证原子性了,格式如下:
set key value [ex seconds] [px milliseconds] [nx|xx]
ex seconds: 为键设置秒级过期时间。
px milliseconds: 为键设置毫秒级过期时间。
nx: 键必须不存在, 才可以设置成功, 用于添加。
xx: 与nx相反, 键必须存在, 才可以设置成功, 用于更新。
面试官:那这样还是会存在一个问题,假如你业务代码没有执行完,然后你的redis又把锁自动释放了,然后其他线程又可以获取到锁,那样不就还是又线程安全问题了?
小白:是的,但是针对这种问题redis官网也帮我们想了一种解决方案,也就是redis的红锁
面试官:那你可以和我说说redis的红锁是怎么回事么?
小白:sorry,i don’t no
面试官:你应该还记得怎么进来的把?我就不送了
小白:这个红锁有兴趣可以看看官网,给大家来一个传送门:redis红锁
面试官:那看你还知道在哪看api就再问一个问题好啦,redis的击穿,雪崩,穿透,都了解没,然后怎么解决呢?
小白:先从雪崩开始说好啦,雪崩就是指再某一个时间点,很多热点key同一时间失效了,那样就会导致之前查redis的请求都去查mysql了,那样就会导致mysql扛不住,然后直接挂了,解决方法就是redis再给这些热点key设置过期时间的时候不要都设置一个时间点,可以加一个随机数。再说击穿好啦,击穿就是我很多请求,一直请求一个热点key,如果这个热点key设置了过期时间,那么它过期那一瞬间,所有请求就全都打到mysql上了,那样也可能导致数据库挂了,解决方案就是给这样的热点key设置永不过期。也就是不设置过期时间就好啦。然后还有穿透,穿透就是我发起的请求再redis中不存在,那样肯定会去请求mysql了的,但是实际上再mysql重也是没有的,比如我查id=-1这样类似的数据。这个解决方案的话就是增加一个布隆过滤器进行处理的。
面试官:那看你答得还行,说说redis得持久化机制把
小白:redis得持久化机制有两种,一种是RDB就是多长时间内多少key发生了变化,就使用一次快照得方式进行一次持久化,还有就是AOF持久化,有三个取值,一个是不开启,一个是每一次对key得修改都以记录日志得方式进行一个记录,还有就是一秒钟记录一次,一半采用最后最后一种。
面试官:那你再和我说说这两种得使用场景,和优劣
小白:直接看官网不会?
RDB的优点
-
RDB是一个非常紧凑的文件,它保存了某个时间点得数据集,非常适用于数据集的备份,比如你可以在每个小时报保存一下过去24小时内的数据,同时每天保存过去30天的数据,这样即使出了问题你也可以根据需求恢复到不同版本的数据集.
-
RDB是一个紧凑的单一文件,很方便传送到另一个远端数据中心或者亚马逊的S3(可能加密),非常适用于灾难恢复.
-
RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能.
-
与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些.
RDB的缺点
-
如果你希望在redis意外停止工作(例如电源中断)的情况下丢失的数据最少的话,那么RDB不适合你.虽然你可以配置不同的save时间点(例如每隔5分钟并且对数据集有100个写的操作),是Redis要完整的保存整个数据集是一个比较繁重的工作,你通常会每隔5分钟或者更久做一次完整的保存,万一在Redis意外宕机,你可能会丢失几分钟的数据.
-
RDB 需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致Redis在一些毫秒级内不能响应客户端的请求.如果数据集巨大并且CPU性能不是很好的情况下,这种情况会持续1秒,AOF也需要fork,但是你-
-
可以调节重写日志文件的频率来提高数据集的耐久度.
AOF 优点
- 使用AOF 会让你的Redis更加耐久: 你可以使用不同的fsync策略:无fsync,每秒fsync,每次写的时候fsync.使用默认的每秒fsync策略,Redis的性能依然很好(fsync是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据.
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
文末
我将这三次阿里面试的题目全部分专题整理出来,并附带上详细的答案解析,生成了一份PDF文档
- 第一个要分享给大家的就是算法和数据结构
- 第二个就是数据库的高频知识点与性能优化
- 第三个则是并发编程(72个知识点学习)
- 最后一个是各大JAVA架构专题的面试点+解析+我的一些学习的书籍资料
还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
.(img-wKVozpt3-1712034812550)]
- 最后一个是各大JAVA架构专题的面试点+解析+我的一些学习的书籍资料
[外链图片转存中…(img-Hy4sonaU-1712034812550)]
还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
更多推荐
所有评论(0)