一面
估计挂了,面试官的编程题还放了水。
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。