2018/12/11面试题整理

版权声明:个人收集,转载注明,谢谢支持 https://blog.csdn.net/qq_42629110/article/details/84956151

2018/12/11

面试题整理

今天的平安面试,1.自我介绍,2.在原岗位上是为何临近过年离职了的?3.说一下你们最近的项目,项目结构搭建,4.项目中用到的dubbo的原理,用的是什么协议,如何实现这个协议的,5.zookeeper是做什么的?在哪上面会用到它,怎么用?6.对于负载均衡你们用的哪一种?怎么用?7.在项目中用到的MQ解释一下什么是MQ?在哪些地方会用到MQ?为什么要用到MQ?有哪些好处?8.说一下Spring和SpringMVC的区别,说一下Spring的事物管理?9.说一下有哪几种线程,线程是如何启动的,用start启动以后线程是否会立刻启动?10.说一下hashmap集合,它是如何的一个机构?它是如何存数据的?分析一下原理?11.说一下sql优化,用过的sql索引是哪种?说一下它的底层数据结构?12.说一下redis,在什么地方会用到它,为什么要用到它,用到它的好处?

1.自我介绍

2.在原岗位上是为何临近过年离职了的

3…说一下你们最近的项目,项目结构搭建

最近的一个项目是一个商场APP项目,项目是SpringBoot+Dubbo的分布式架构
主要分为后台模块,首页模块,购物车模块,订单模块,支付模块,秒杀模块…
技术选型使用了Mysql数据库,Redis缓存中间件,RabbitMq消息中间件,Tomcat服务器

4.项目中用到的dubbo的原理,用的是什么协议,如何实现这个协议的

dubbo的结构大致分为服务提供者,服务消费者,注册中心,监管平台
其中注册中心使用的是ZooKeeper实现服务的注册与发现,协议是ZooKeeper协议,服务的提供者在dubbo节点下创建服务节点,服务节点的consumers节点下创建临时节点存放服务提供地址,服务的消费者在ZooKeeper中发现服务,在服务节点的Provider节点下创建临时节点,也会存放服务节点地址但其实没什么实际作用,然后在将服务的消费地址返回到消费者工程中,如果是多个提供者,会返回地址列表
拿到提供者者地址信息后就算注册中心宕机也没关系,服务消费者通过地址,采用Dubbo协议+netty框架RPC远程调用服务消费者;建立长连接,以及使用监管中心监控

5.Zookeeper是做什么的?

ZooKeeper在Dubbo中是用来提供命名服务的,也就是我们常说的注册中心
ZooKeeper在其他场景下还可以有其他作用
比如统一配置文件,集群管理,分布式锁等…

6.对于负载均衡你们用的哪一种?怎么用?

service使用的是Dubbo+ZooKeeper默认的负载均衡,Controller层使用的是Nginx负载均衡进行请求分发
Zookeeper通过监管中心就可以进行修改权重,以及策略的选择,轮询,随机,最小占用
Nginx服务器配置location / {
proxy_pass tomcatlist
}

7.在项目中用到的MQ解释一下什么是MQ?在哪些地方会用到MQ?为什么要用到MQ?有哪些好处?

系统间需要异步通讯的时候,比如商品添加的时候后台工程需要调用搜索工程进行索引创建,商品详情工程进行freemarker静态页的生成等
在订单模块都会使用到定时功能
处理高并发场景的时候使用MQ实现请求的削峰
为什么要用MQ?
因为分布式工程之间的通信,不是工程内的通信,必须通过Http请求等才能实现
对比HttpClient,MQ之间的通信是异步的,提高了系统内的性能,并且在降低了系统间的耦合

8.说一下Spring和SpringMVC的区别,说一下Spring的事物管理?

Spring和SpringMVC都是Spring体系下的框架,但是分工不同,Spring是贯穿表现层,控制层,服务层,数据层的一站式框架,而SpringMVC是控制层的解决方案,主要针对用户请求以及调用服务层,并且Spring和SpringMVC都是IOC容器,但是存在父子容器的关系,SpringMVC中可以访问Spring的Bean,而反过来就不可以了;
Spring的事务管理,声明式事务主要通过三个API实现
1.平台事务管理器
2.事务属性
3.AOP代理
通过表达式匹配对应的方法,对对应的方法进行事务增强,AOP横切逻辑,在进入方法前开启事务然后在方法结束后事务关闭,如果方法出现异常,事务回滚即可

9.说一下有哪几种线程,线程是如何启动的,用start启动以后线程是否会立刻启动?

继承Thread类,实现Runnable接口,实现Callable接口(有返回值)

线程通过start方法启动,
线程会立刻启动但是线程不会立刻执行,只要抢占到cpu资源时才会运行run方法

10.说一下hashmap集合,它是如何的一个结构?它是如何存数据的?分析一下原理?

hashmap集合底层是一个哈希表
从微观分析这个哈希表可以分为一个数组中存储多个链表或者红黑树
元素存储在hashmap中,key值会通过哈希函数转化为一个数组下标
如果下标中没有元素直接存储,如果下标中有元素,jdk1.7是放在表头,jdk1.8是放在表尾
当链表的长度达到8的时候链表会转换成红黑树,提高查询性能
但是一般如果链表变成了红黑树这个map的查询效率就以及很低了,需要考虑扩容打散哈希表中的元素聚集
扩容机制
刚创建的时候扩容默认是16,最大元素数12,扩容因子0.75,是在元素插入之后扩容的
除了第一次创建,其他都是默认扩容为原来容量的两倍,实在元素插入之前扩容的

11.说一下sql优化,用过的sql索引是哪种?说一下它的底层数据结构?

sql优化,主要从几个方面考虑
从简单到分库分表
1.数据类型优化
数据类型尽量选择小而简单的类型即可,但是需要考虑到最大值的范围
2.索引优化
索引优化使我们程序员常用的操作,通过单索引,多索引,唯一索引,覆盖索引,聚簇索引等实现sql查询的性能提升;
一般我是先开启慢查询,设置好阈值,然后先让数据库跑半天,然后会筛选出不达标的sql语言,在通过expire查看sql语句的执行计划,观察sql_type执行顺序,type执行的类型通常需要达到range级别,rows观察表设计的行数不能太多一般上万就需要优化,extra查看是否使用到覆盖索引等对sql语句创建指定索引,或者更改sql语句的结构等使得sql语句的执行效率提高
3.硬件优化
硬件方面的优化我暂时还没有太过于研究
4.分库分表
对mysql数据库进行集群搭建,使用读写分离中间件mycat

Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。

sql索引引擎innoDB
底层的数据结构是B+Tree
首先分析一下其他数据结构为什么没有被mysql选择
哈希表,单个元素查询速度最高,但是不支持范围查询
二叉树,不平衡,最差时效率和链表查询速率一直
红黑树,虽然解决了平衡的问题,但是一旦数据量达到一定量级,会发现内存不够,可能会进行大量的磁盘IO读写,性能大大下降
最后mysql选择了B-Tree,一个平衡的多路数,选择合适的度,使用分裂的方式进行大数据量的索引树存储
在B-Tree的基础上升级成了B+Tree主要区别就是每一个非叶子结点都可以在叶子结点上找到,并且叶子结点之间两两相连接

12.说一下redis,在什么地方会用到它,为什么要用到它,用到它的好处?

redis的主要应用场景有很多
1.也是最常见的应用场景-数据缓存服务器,专门为程序提供临时数据缓存的功能,避免了请求到达底层储存系统,大幅度提高了服务器响应的数据
2.应对高速读写的场景,面对高速读写的场景,常会发生高并发问题,使用redis底层是单进程的特性结合lua脚本对业务逻辑进行原子性操作实现了数据的一致性并且redis处理数据的能力远远高于传统的关系型数据库
3.分布式锁
上面说了高并发问题,通过redis单进程的特性
分布式系统或者集群环境下,某些同步业务方法,无法再有效的保证业务安全,因为当前工程的同步关键字不能锁住其他工程的线程,因此完全有可能有几个线程进行相关的业务操作;这时候,他们可以通过redis分布式锁让不同的工程区同一个地方加锁,从而保证只有一个线程在进行业务操作,保证线程安全
4.数据共享
实现SSO单点登录,使用redis作为缓存数据服务器,各个系统都访问redis获取用户信息,起到session的作用,在使用Cookie保存令牌,实现用户数据共享,进而实现SSO单点登录
在分布式集群环境下,有些数据如果放在session中,那么会导致其他的tomcat服务器无法访问这个数据,这样用户就会发现数据的展示时有时无;通常来说,这些数据就需要进行共享处理,redis就可以充当数据共享的服务器
5.消息的订阅和发布(不常用的场景),比较与MQ产品,redis基于内存,数据是轻量级的,只能进行一些简单的数据传递;

猜你喜欢

转载自blog.csdn.net/qq_42629110/article/details/84956151