阿里云无影云面试总结

410 阅读4分钟

一面

估计挂了,面试官的编程题还放了水。

1、java中stringBuffer和StringBuilder的区别。

2、java中Spring框架如何实现事务的?

估计想问的点是声明式事务
声明式事务:建立在AOP之上的,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明即可。

1.Spring事务底层是基于数据库事务和AOP机制的。
2.首先对于使用了@Transactional注解的Bean,Spring会创建一个代理对象作为Bean。
3.当调用代理对象的方法时,会先判断该方法上是否加了@Transactional注解。
4.如果加了,那么则利用事务管理器创建一个数据库连接。
5.并且修改数据库连接的autoCommit属性为false,禁止此连接的自动提交,这是实现Spring事务非常重要的一步。
6.然后执行当前方法,方法中会执行sql。
7.执行完当前方法后,如果没有出现异常就直接提交事务。
8.如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务。

注:
1.Spring事务的隔离级别对应的就是数据库的隔离级别。
2.Spring事务的传播机制是Spring事务自己实现的,也是Spring事务中最复杂的。
3.Spring事务的传播机制是基于数据库连接来做的,一个数据库连接就是一个事务,如果传播机制配置为需要新开一个事务,那么实际上就是先新建一个数据库连接,在此新数据库连接上执行sql。

3、redis的过期删除策略?

1、定时过期
2、惰性过期
3、定期过期

4、redis lua脚本为什么能保证原子性?

Redis使用同一个Lua解释器来执行所有命令,同时,Redis保证以一种原子性的方式来执行脚本:当lua脚本在执行的时候,不会有其他脚本和命令同时执行,这种语义类似于 MULTI/EXEC。从别的客户端的视角来看,一个lua脚本要么不可见,要么已经执行完。

5、HashMap中如果重写hashCode方法,直接返回一个1,那么一个for循环中put 1000次会发生什么?

往1这个地址写1000个值?一个1000的链表?

6、系统有什么优化的地方吗?

这个自己要再想想。

7、系统如果需要扩容10倍,该怎么处理?

kafka分partition,多台机器处理。

Zset分成多个延迟队列处理。

编程题:

1、leetCode 179 最大数

2、leetCode 151 反转字符串中的单词

二面

我擦,一面居然过了,二面没有做题和八股,全程怼项目问。
二面挂掉了。

1、项目上线后遇到什么问题没?

过期时间设置问题,7点钟大量key同时过期。

把key的过期时间加一个随机数,随机分布到7点到8点的某个时刻。

配置问题,策略树二叉树结构配置出环,执行时候会陷入死循环。

增加校验,遍历二叉树,用HashSet存储节点,如果遇到遍历过的节点就说明有环。

2、在虾皮做的一些优化?

消费端kafka消费能力优化

店铺的region字段基本不会变化,直接缓存到内存中,不需要每次都查询redis。

活跃时间之前是序列化为JsonString存储,修改时需要先查回来然后再set。优化后直接用hash进行存储,直接set每个字段,不需要先做查询。而且可以使用pipeline批量set。可支持的QPS从3W提升到10W+。

SQL语句查询优化

selcet distinct语句,随着数据的增加,MySQL底层使用了错误的索引,扫描了联合索引的全部,查询超时。

使用explain进行分析,利用松散索引扫描,将查询时间从10s优化到0.5s。

3、kafka会丢消息吗?怎么保证消息不丢失?

4、redis什么时候丢失数据?

5、kafka和rabbit MQ的区别?

6、rabbit MQ为什么更可靠?

7、在团队中你有什么价值?在项目中起到了哪些作用?