面试杂谈(一)
1.redis穿透与雪崩(解决方法)
缓存穿透:访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。
解决方法:1:采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤。 2:访问的key未在DB查到时,也将空值写进缓存,但可以设置较短过期时间。
缓存雪崩:大量的key同时失效,然后又来了一大波请求,造成瞬时DB请求量大、压力骤增,引起雪崩。
解决方法:可以随机设置缓存的过期时间,尽量避开同一时间失效。
缓存击穿:一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。
解决方法:在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。
2.动态代理的实现原理
JDK采用反射技术,CGLIB采用class文件的二进制字节码(asm)。
3.IOC的实现原理
反射+工厂模式
4. Spring事务中常用的参数
属性 | 类型 | 描述 |
---|---|---|
传播性 |
枚举型:Propagation |
可选的传播性设置 |
隔离性 |
枚举型:Isolation |
可选的隔离性级别(默认值:ISOLATION_DEFAULT ) |
只读性 |
布尔型 | 读写型事务 vs. 只读型事务 |
超时 |
int型(以秒为单位) | 事务超时 |
回滚异常类(rollbackFor) |
一组 Class 类的实例,必须是Throwable 的子类 |
一组异常类,遇到时 必须 进行回滚。默认情况下checked exceptions不进行回滚,仅unchecked exceptions(即RuntimeException 的子类)才进行事务回滚。 |
回滚异常类名(rollbackForClassname) |
一组 Class 类的名字,必须是Throwable 的子类 |
一组异常类名,遇到时 必须 进行回滚 |
不回滚异常类(noRollbackFor) |
一组 Class 类的实例,必须是Throwable 的子类 |
一组异常类,遇到时 必须不 回滚。 |
不回滚异常类名(noRollbackForClassname) |
一组 Class 类的名字,必须是Throwable 的子类 |
一组异常类,遇到时 必须不 回滚 |
5.bean的生命周期
- Spring容器 从XML 文件中读取bean的定义,并实例化bean。
- Spring根据bean的定义填充所有的属性。
- 如果bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanName方法。
- 如果Bean 实现了 BeanFactoryAware 接口, Spring传递beanfactory 给setBeanFactory 方法。
- 如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。
- 如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。
- 如果有BeanPostProcessors 和bean 关联,这些bean的postProcessAfterInitialization() 方法将被调用。
- 如果bean实现了 DisposableBean,它将调用destroy()方法。
6. SpringMVC(原理、过滤器等)
(1)前端控制器 DispatcherServlet(不需要程序员开发)
作用:接收请求、响应结果 相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
(2)处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的URL来查找Handler
(3)处理器适配器HandlerAdapter
注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
(4)处理器Handler(需要程序员开发)
(5)视图解析器 ViewResolver(不需要程序员开发)
作用:进行视图的解析 根据视图逻辑名解析成真正的视图(view)
(6)视图View(需要程序员开发jsp)
View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)
7. HashMap查询速度为什么那么快?
根据key计算出hashcode,然后根据hashcode值与数组进行&运算,得到该key值在数组中存放位置的索引。直接根据数组索引去取元素,查询速度当然很快
8. 简述MVC模式
MVC,全称Model(模型)-View(视图)-Controller(控制器),这是一种开发模式,他的好处是可以将界面和业务逻辑分离。
Model(模型): 是程序的主体部分,主要包含业务数据和业务逻辑。在模型层,还会涉及到用户发布的服务,在服务中会根据不同的业务需求,更新业务模型中的数据。
View(视图): 是程序呈现给用户的部分,是用户和程序交互的接口,用户会根据具体的业务需求,在View视图层输入自己特定的业务数据,并通过界面的事件交互,将对应的输入参数提交给后台控制器进行处理。
Controller(控制器): Controller是用来处理用户输入数据,已经更新业务模型的部分。控制器中接收了用户与界面交互时传递过来的数据,并根据数据业务逻辑来执行服务的调用和更新业务模型的数据和状态。
9. 我自己搜的多线程问题
https://www.cnblogs.com/huajiezh/p/5790942.html
10. IOC怎么解决循环依赖问题
https://www.cnblogs.com/chenpt/p/9896618.html
11. 并发情况下如何控制商品的数量
请园友回答(lz不会···):
12. Springboot优点
简化配置,内置tomcat,提高开发效率。(面试官问还有吗?。。。lz不知道还想考察啥啊?还请园友留言指点)
13. 谈谈对SpringCloud的理解
//后续有经典题目再补充······对上述的问题回答不足之处还请留言指出,