南京烽火面试总结

本文总结了南京烽火面试中涉及到的Java基础、数据库优化、框架及微服务相关问题。讨论了幂等性实现、SQL优化、MySQL引擎比较、Spring MVC运行流程等,揭示了面试中的关键技术和思考角度。
摘要由CSDN通过智能技术生成

本场 Chat 分享主要介绍南京烽火贵阳开发部的面试问题, 并引入相关的基础知识,在此过程中,结合作者的经验和学到的知识,提出一些观点和建议。

本场 Chat 内容将涉及如下:

1,面试中问到的Java基础2,面试中问到的框架问题3,面试中问到的数据库问题4,面试中问到的项目中的技术问题

南京烽火是一家大公司面试的人很多,他们是三个面试官面一个开发者,两个技术一个HR,开始就HR先介绍一下他们公司是做什么的介绍了一堆,然后就是让我自我介绍。介绍完毕两个技术轮流开始向我提问,提问的方式是先从我的项目中找问题问我,有难入简的方式提问。1,在你们的电商项目中,是如何进行幂等的?2,在你们的项目中有没有遇到过查询慢的情况,你是怎么解决的?如果没有遇到现在我有一个页面加载后台数据展示需要20s才能加载出来,你怎么处理让他在2s类相应?3,我现在有1000万条数据怎么插入数据库?4,谈谈你对MySQL 的MyISAM 和innoDB的理解?5,SQL优化有了解过吗?你平时都是怎么做SQL优化的?6,谈谈你对MySQL读写分离 ,主从复制的理解?7,谈谈你对MVC的理解?8,请你说一下spring MVC的运行流程?9,谈谈你对spring 的IOC和AOP的理解10,spring MVC,和spring boot有什么区别?11,微服务有了解过吗?RPC框架有使用过那些?12,谈谈你对hashMap的理解?问了我上面的这些问题后,HR问了一下我对薪资的要求,然后又说了一下他们公司的薪资架构和体系,就让我回来等通知,如果被录用HR会电话联系我。

现在来回顾一下面试中的问题和答复1,2问主要是针对我的项目提问,3-6主要是考察我的数据库知识点和能力,7-10主要考察我框架的能力,11主要是看我会不会分布式,有没有使用过分布式,我没有使用过分布式做开发,这里它就没有在问下去了,12主要是考察我Java基础。现在我来把它们面试的问题给总结回答一下,下面的问题我面试的时间基本都答上来了。

1,在你们的电商项目中,是如何进行幂等的? 幂等的常用思路 1.1,多版本并发控制,乐观锁的一种实现,在数据更新时需要去比较持有数据的版本号,版本号不一致的操作无法成功。例如博客点赞次数自动+1的接口 1.2. 去重表:#### 利用数据库表单的特性来实现幂等,常用的一个思路是在表上构建唯一性索引,保证某一类数据一旦执行完毕,后续同样的请求再也无法成功写入。 1.3. TOKEN机制:#### 这种机制就比较重要了,适用范围较广,有多种不同的实现方式。其核心思想是为每一次操作生成一个唯一性的凭证,也就是token。一个token在操作的每一个阶段只有一次执行权,一旦执行成功则保存执行结果。对重复的请求,返回同一个结果。2,在你们的项目中有没有遇到过查询慢的情况,你是怎么解决的?如果没有遇到现在我有一个页面加载后台数据展示需要20s才能加载出来,你怎么处理让他在2s类相应? 2.1慢查询的问题主要从几个方面入手,第一数据方面对数据库进行优化,合适的给表建索引,给查询加缓存,或者使用存储过程等方式优化数据库的查询,其次就是对复杂业务的代码中的for循环多次循环调用查询语句请求数据库的代码优化等。3,我现在有1000万条数据怎么插入数据库? 3.1选择合适的引擎进行处理,使用MyISAM引擎进行处理,我做过测试执行100万条数据MyISAM用时28s innoDB用时77s,这是放到事务中一次提交执行的时间。所有回答这个问题就得分解大的操作,降低单个操作的阻塞时间。4,谈谈你对MySQL 的MyISAM 和innoDB的理解? 4.1 MyISAM 不支持事务,MyISAM 不用考虑同步,查询和增加快,MyISAM 支持全文索引,MyISAM支持表锁,不支持外键。MyISAM 适合于一些需要大量查询的应用,innoDB它支持“行锁” ,于是在写操作比较多的时候,会更优秀5,SQL优化有了解过吗?你平时都是怎么做SQL优化的? ① 使用group by 分组查询是,默认分组后,还会排序,可能会降低速度, 在group by 后面增加 order by null 就可以防止排序. explain select * from emp group by deptno order by null; ② 有些情况下,可以使用连接来替代子查询。因为使用join,MySQL不需要在内存中创建临时表。 select * from dept, emp where dept.deptno=emp.deptno; [简单处理方式] select * from dept left join emp on dept.deptno=emp.deptno; [左外连接,更ok!]

③ 对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 最好不要给数据库留 NULL,尽可能的使用 NOT NULL 填充数据库.

6,谈谈你对MySQL读写分离 ,主从复制的理解? 在数据库集群架构中,让主库负责处理事务性查询,而从库只负责处理select查询,让两者分工明确达到提高数据库整体读写性能。当然,主数据库另外一个功能就是负责将事务性查询导致的数据变更同步到从库中,也就是写操作。 读写分离的好处 1)分摊服务器压力,提高机器的系统处理效率 读写分离适用于读远比写的场景,如果有一台服务器,当select很多时,update和delete会被这些select访问中的数据堵塞,等待select结束,并发性能并不高,而主从只负责各自的写和读,极大程度的缓解X锁和S锁争用 2)增加冗余,提高服务可用性,当一台数据库服务器宕机后可以调整另外一台从库以最快速度恢复服务

7,谈谈你对MVC的理解? M表示模型,JavaBean V表示视图, HTML jsp volicity C代表控制器 servlet Action

最简单的MVC模型就是 jsp+servlet+javaBean,实际上都是把视图和逻辑隔离开来使用 struts2和springmvc这样的MVC框架,什么是MVC框架,是为了解决传统MVC模式jsp+servlet+javabean问题而出现的框架。传统MVC的的主要问题,1,所有的servlet和servlet的映射都要配置在web.xml中,如果项目太大,web.xml就太庞大,并且不能实现模块化管理2,servlet的主要功能就是接受参数,调用逻辑,跳转页面,比如像字符编码,图片上传功能也要写在servlet中,不能让servlet功能单一。接受参数比较麻烦,不能通过model接收,只能单个接收,接收完成后转换封装model。跳转页面方式比较单一,转发和重定向,并且当我我们页面发生改变时需要修改servlet源代码

8,请你说一下spring MVC的运行流程? 1,捕获请求,用户向服务器发送请求,请求被spring的前端控制器DispatcherServelt捕获。 2,查找handler,DispatcherServelt对请求URL进行解析,然后根据URL调用handlerMapping获得handler配置的所有相关对象。 3,执行handler DispatcherServelt 根据获得的handler 选择一个合适的handlerAdapter 填充handler入参 4,选择viewresolver,DispatcherServelt 根据返回的modelAndView选择合适的viewresolver 5,渲染返回 通过viewresolver结合model和view来渲染视图,DispatcherServelt 将渲染结果返回给客户端9,谈谈你对spring 的IOC和AOP的理解 spring 是JavaEE应用程序的框架,是轻量级的IOC和aop的容器框架 IOC 控制反转,依赖注入,原来我们的Service需要调用dao,Service需要自己创建dao. spring spring发现你Service依赖dao,就自动给你注入dao. 核心原理,就是配置文件+反射+容器(map) aop面向切面编程 核心原理:使用动态代理的方式在执行前后出现异常做后相关逻辑 1,事务处理 执行方法前开启事务,执行完成后关闭事务,出现异常后回滚事务。 2,权限判断 在执行方法前,判断是否有权限 3,日志 等场景使用aop10,spring MVC,和spring boot有什么区别? spring boot就是一个大框架里面包含了许许多多的东西,其中spring就是最核心的内容之一,当然就包含spring mvc。 spring mvc 是只是spring 处理web层请求的一个模块。 我理解的springboot spring boot 我理解就是把 spring spring mvc spring data jpa 等等的一些常用的常用的基础框架组合起来,提供默认的配置,然后提供可插拔的设计,就是各种 starter ,来方便开发者使用这一系列的技术,套用官方的一句话, spring 家族发展到今天,已经很庞大了,作为一个开发者,如果想要使用 spring 家族一系列的技术,需要一个一个的搞配置,然后还有个版本兼容性问题,其实挺麻烦的,偶尔也会有小坑出现,其实蛮影响开发进度, spring boot 就是来解决这个问题,提供了一个解决方案吧,可以先不关心如何配置,可以快速的启动开发,进行业务逻辑编写,各种需要的技术,加入 starter 就配置好了,直接使用,可以说追求开箱即用的效果吧.

11,微服务有了解过吗?RPC框架有使用过那些?

12,谈谈你对hashMap的理解? hashmap采用了数组和链表的数据结构,在查询和修改继承了数组的线性查找和链表的寻址修改。 hashmap是非同步的。所有很快。hashmap可以接受null键和null值,而hashtable不能,原因就是equlas()方法需要对象。 hashmap是使用get从hashmap中获取对象,当我们给put方法传递键和值时,先对键调用hashcode计算并返回map数组的node对象 JDK1.8put 1,对key求hash值,然后计算下标。如果hash值不相同,放到不同的地方。 2,如果hash值相同,以链表的方式链到后面,如果链表的长度大于等于8,把链表转成红黑树,链表长度低于6,就转回链表 3,如果hashmap的大小超过默认的负载因子大小为0.75,将会创建原来HashMap大小的两倍的bucket数组

重新调整hashmap的大小存在的问题1,会存在条件竞争,如果条件竞争发生就会死循环。多线程的环境下不适用hashmap多线程会导致死循环,发生过程1,hashmap的容量有限,达到饱和时,key映射位置发生冲突的概率高,hashmap需要扩容,扩容需要把原来的数据重新hash到新数组。红黑数见解:1,每一个阶段非红即黑2,根节点总是黑色的。3,如果节点是红色的,那么它的子节点必须是黑色的。4,每个叶子节点都是黑色的空节点。5、从根节点到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)

阅读全文: http://gitbook.cn/gitchat/activity/5d560b97fefcec791aabda88

您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

FtooAtPSkEJwnW-9xkCLqSTRpBKX

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值