一面:
问:熟悉Java基础是吧,那就先不多问Java了。
计网学过是吧,聊一聊吧
当时只说出了七步,追问DNS解析过程,当时答不出来。
2、HTTP常见状态码
3、重定向和转发
4、三次握手与四次挥手
5、发生错误时异常
聊聊MySQL吧
1、MySQL为什么使用B+树?
(思路:从二叉树-->AVL树-->红黑树-->B树-->B+树,分别说出前者缺点,从而引出后者优点)
简要回答:二叉查找树在极端情况会产生链表,AVL树自平衡旋转过于耗时消耗性能,红黑树较为优秀,因此被HashMap采纳,但是由于单个结点,因此引出B树(B树是MongoDB的底层存储),B树特点...,因此出现了B+树,B+树特点...。最后对比B树和B+树特点。
2、为什么推荐主键使用自增的整型?
(思路:分为三个方面:为什么要主键?为什么要自增?为什么要整型?)
3、最左前缀原则?(原题是abc三个列,建立了索引(a,b),(a,b,c),当select时where条件是a=XXX时会走哪个索引?)
呃,只知道where a = XXX会走索引,where b = XXX and a = XXX不会建索引,这个问题当时没答出来,因为分不清
4、锁相关,(共享锁和排他锁)
意向锁呢?--->聊到行锁和表锁--->聊到InnoDB引擎和MyISAM的区别
5、MVCC?
思路:事务隔离级别(MySQL默认为RR,SqlServer、Oracle为RC)--->MySQL中没有幻读,如何解决的?--->MVCC
Redis学过,说说吧
我就很自觉地大概从头到尾把知道的说了一遍
1、Redis为什么是单线程的?为什么效率还那么快?
单线程不需要上下文切换,Redis将所有数据都放在内存中,所以使用单线程效率就是最高的,多线程上下文切换是耗时操作,对于内存而言,没有上下文切换效率就是最高的。
2、数据类型
3、持久化:RDB和AOF
RDB:默认的持久化方式,生成的文件名默认为dump.rdb,
主要两种保存指令,手动保存save和自动保存bgsave,默认自动保存
AOF:以独立日志方式写入(只保存对数据进行修改的数据,即get等命令不保存),开启需要在配置文件中更改生效,生成的文件名默认为appendonly.aof,
写数据的三种策略:always、everysec、no,默认使用everysec。由于AOF记录的是日志会导致其文件大小较大,因此有AOF重写机制,重写规则:已超时的数据不写入、忽略无效指令、对同一数据的多条写合并为一条;重写方式也有手动重写bgsave指令和自动重写(修改配置文件生效)
4、事务:开启事务multi、执行事务exec、取消事务discard
5、锁:watch必须在unwatch之后才能使用;
分布式锁:利用setnx设置一个公共锁,有值返回设置失败,无值返回设置成功,操作完毕通过del释放锁;
死锁的解决:使用expire为锁设置过期时间限制
6、删除策略:过期数据并不是真正删除了,而是由删除策略决定
三种删除策略:定时删除、惰性删除、定期删除,redis采用的有第2和3种
逐出算法:
7、主从复制的大体过程
8、哨兵模式及哨兵的作用
9、缓存预热、缓存雪崩、缓存击穿、缓存穿透的相关概念及解决方式
Java方面聊一下吧
1、介绍一下HashMap?
思路:默认容量,负载因子,扩容阈值,红黑树与链表转换阈值,JDK1.7与1.8的区别,为什么引入红黑树
2、HashMap的是先put还是先resize?
详细介绍resize方法,扩容达到上限时,将扩容阈值直接设置为Integer.MAX_VALUE以此来避免扩容。
详细介绍put方法,底层调用putVal方法,先进行插入(判断是否哈希冲突,是否红黑树结点,否就进行链表插入),又因为resize方法放在较尾部,所以综上所述先put再resize。
JVM也了解是吧
(因为说《深入了解JVM》看了好几遍,感觉面试官以为我飘了吧。。)
1、简单说一下堆?
逻辑上:年轻代(Eden、S0、S1)、老年代(对象阈值为15进入老年代)、方法区(落地实现在永久代)
物理上:年轻代与老年代,方法区JDK1.7在永久代,1.8被元空间替换
为什么要分代、分区?IBM的研究表明绝大多数对象都是朝生夕死的
2、String s = new String("a");创建了几个对象?分别在哪?
两个,new在堆,a在字符串常量池
追问:字符串常量池在哪?
JDK1.6时字符串常量池在方法区中;JDK1.7开始着手去永久代,将字符串常量池移到了堆中;JDK1.8替换为元空间,字符串常量池还是留在堆中,没有移回去。
伯乐系统:
后面省略了。。。
二面:
1、两个Integer类型如何比较,使用“==”还是equals()
==是比较基本数据类型是比较值,比较引用类型是比较地址;equals比较引用类型是比较值
int与int比较,直接使用==比较
Integer与int比较,==比较时,Integer将会发生自动拆箱(调用intValue()方法)
两个Integer比较时,当它们都在[-128,127]之间,使用"=="比较和equals比较返回的都是true;在此区间范围之外"=="比较为false,equals比较为true。原因是因为Integer中有一个内部类IntegerCache,当处于此区间的值都是相同的地址和值,因此此区间的==与equals都为true
2、一个网站的架构模型是怎样的?
(我裂开来,这说不出来啊,只能瞎编)
Nginx集群请求转发,MySQL集群存储,Redis集群做缓存,SpringCloud中的Eureka注册中心负责调度,Gateway网关以及Hystrix实现服务限流服务熔断,但是Nacos可以完全替代Eureka+Config+Bus,Sentinel代替Hystrix,以及配上Seata来实现完整的服务。
现在来看,真的是在瞎扯。嗨,败在了这个问题上。
看完Dubbo2.7版本的官网架构图大家懂的都懂了。
然后就没有然后了,哎,第一次,败在了还未曾入门的微服务架构演变上。
不过也是第一次而已,未来继续加油努力。
全部评论
(45) 回帖