第一场面试

简单三分钟自我介绍

自我介绍这里一笔带过,给对面介绍自己内在 + 外在 + 校园经历 + 校园项目 + 意向岗位

技术面

1. Spring 原理篇

1.1 有使用过Spring吗,说一说它的 SpringMVC 原理

主要有5个组件,前端控制器、映射器、处理器、处理器适配器、视图解析器

  • 前端控制器也就是中央处理器,它主要负责前端用户的请求和对其他组件的转发调用;

  • 前端控制器接收到请求后,会把请求转发给处理器映射器,处理器会根据配置或注解(@Controller)找到最终要执行的Handler;

  • 然后将Handler(自己的业务处理)对象以及其对应的拦截器,封装到HandlerExecutionChain对象中并以它的形式放回;

  • 前端控制器根据获取到的Handler(Controller),去选择一个合适的HandlerAdapter(它还支持Servlet、HttpRequestHandler、ThrowawayController),成功获取到会先去执行拦截器;

  • 这时将开始对提取Request中的模型数据,并且将Handler的入参进行数据填充,以至于我们写控制层方法时,入参是前端传来的值,在填充过程中,根据自己的配置,Spring还可以帮你做一些额外操作:

    • Json/Xml 数据转换成对象
    • 格式化请求数据
    • 校验
  • Handler执行完成后,返回一个ModelAndView(视图和视图需要填充的模型数据)

  • 前端控制器根据返回的ModelAndView,选择合适的ViewResolver

  • ViewResolver 结合Model和View,来渲染视图

  • 最终前端控制器将渲染结果返回给客户端

1.2 springboot 有什么优点

springboot 它可以帮我快速、使用最低代码最少时间开发出一个项目,不想 SpringMVC,需要繁琐写很多配置信息,我们只关注写业务代码即可。

通过配置文件解耦代码,在一些可能改动的配置信息,可以不通过修改代码再打包部署,而是让代码去外部读取该配置文件,再去运行。

还有SpringBoot是使用了maven 可以方便对版本的管理,能够让自己不需要考虑版本依赖问题和兼容版本的问题。

Redis 篇

有使用过 Redis吗

有,它是一个缓存数据库,主要存储的是k-v类型的数据。

那说说它的一个缓存雪崩?

嗯?缓存雪崩的话,就是key集中失效,导致 Redis 相当于宕机,大量请求依旧打到mysql数据库上了。

这里总结一下,其实雪崩Redis服务基本不可用了,存储层的调用量会暴增,造成存储层也会挂掉的情况,而且雪崩会出现周期性的峰值,因为就算缓存失效了,请求到了存储层,获取到数据后,是会再做一次缓存的,所以会出现周期性峰值。

致命的原因是存储层在暴增的情况下扛不住调用后,导致数据库直接挂掉了。

有什么解决措施?

嗯?我们可以对那个 key 的缓存时间设置更长一些,缓存雪崩导致的原因是因为太过于集中失效,导致暴增,那么如果我们均摊一下时间,就能避免出现该情况,所以我们可以对缓存时效设置的更随机性一些,且对一些热点数据缓存时间设置永久性。