首页 > 招银网络java一二面,已过,资料评审中
头像
JefferySaw
编辑于 2021-09-06 15:52
+ 关注

招银网络java一二面,已过,资料评审中

本人3年经验,猎头帮忙投的一年岗位,问题不难,基本都懂就是答得非常乱,以下内容跟当时回答的内容有所出入,发帖子纯当提升个人逻辑与表达。
2021.8.24一面

主要会哪些东西?

redis,mysql,zookeeper,spring。。。。

讲一下缓存雪崩/击穿/穿透

缓存雪崩指缓存大面积失效导致请求大量落到数据库上,解决方式是1、多级缓存,2、缓存时间加随机数,3、使用布隆过滤器。
缓存击穿指并发请求通过单个已失效的缓存落到数据库上,解决方式是1、热点数据永不过期,2、数据库请求互斥可以解决。
缓存穿透指请求了缓存和数据库中没有的数据,导致大量请求直接落到数据库上,解决方式是1、请求接口层增加参数校验,2、缓存无效参数为key-null,3、使用布隆过滤器。

刚才提到了布隆过滤器,说一说这是什么?

布隆过滤器由一个二进制表和一组哈希函数组成,将数据key经过各个哈希函数计算得到的值保存在二进制表中。
当新的请求到达时,先将该请求key经过哈希集计算的结果与二进制表做比对,如果都为1说明该请求有可能从数据库取到数据,否则无法取到。

为什么说结果为1是有可能,而结果为0一定取不到数据?

因为可能存在多个值的哈希结果相同,而比对结果为0说明一定无法从该二进制表更新时的数据快照中取到数据。

我们知道redis是一个单线程程序,为什么说它运行很快?

1、redis是一个内存数据库,内存中读写速度都很快。
2、redis是一个单线程程序,避免了多线程下的上下文切换损耗的性能。
3、redis使用了IO多路复用模型,是非阻塞IO,可以处理并发的连接。
4、redis是基于事件模型Reactor模型的程序,内部处理都是通过事件完成。

redis的IO是怎么样的?

redis中的IO操作针对操作系统的实现做了一层简单封装,形成统一的API。根据操作系统的不同,主要可以使用kqueue,epoll和select。

看你之前的项目中有用mySql,说说mySql的索引

索引是一个为了加快查询速度而使用的数据结构。mySql中通过B+树实现了索引。
B+树的一个特点是数据只保存在叶子节点中,而且叶子节点间形成一个单链表,适合进行区间查找。mySql根据这个特性,将叶子节点和非叶节点保存在不同的段中,而每个段包含多个区,每个区以数据块形式保存,这样在实际查询数据时可以使用顺序io而非随机io。

那为什么不选择使用二叉树呢,从层高方面说下

B+树的每个节点可保存的数据是[M/2, M-1]个,而二叉树每个节点仅有一个数据。

说说mySql中的锁

锁分两种,读锁(X)和写锁(S)。读锁下,允许多个事务同时对相同数据集的读操作,阻塞对应写操作;写锁下,允许单个事务对数据集的写操作,阻塞相同数据集上的其他读写操作。
mySql的InnoDB默认为行锁,事务给记录行加读锁时需要先获取所在表的表级意向读锁;给记录行加写锁时需要先获取所在表的表级意向写锁。
行级锁(X和S)与表级意向锁(IX和IS)的兼容关系如下:

X IX S IS
X x
x x
x
IX x x
S x x
IS x


对数据集执行UPDATE、DELETE、INSERT时会自动加上写锁,SELECT时不会加锁,使用SELECT FOR UPDATE会显性加写锁,使用SELECT LOCK IN SHARE MODE会显性加读锁。
另外,在RR的隔离级别下,InnoDB会使用到Gap锁,Gap锁会锁住记录行到左右两边的记录间的数据间隙。Gap锁和行锁组合形成Next-key锁,Next-key锁会锁住行记录及左右两边的间隙。

mySql的最左匹配原则是什么?

mySql的联合索引检索规则是从左到右进行检索,原因在于mySql创建联合索引时是根据联合索引的列从左到右进行排序的。

创建联合索引a,b,c,根据a,b进行查找是否使用了联合索引?b,c进行查找呢?(上一个问题没一针见地直接讲明白,竟然从底层存储开始讲就讲乱了)

a,b进行查找可以使用,b,c不行。

说一说Java集合中的ArrayList和LinkedList

ArrayList内部使用数组保存数据,LinkedList内部使用双向链表保存数据。

LinkedList有什么使用场景?

存在大量针对头节点和尾节点的插入/删除/读取操作时可以考虑使用LinkedList。

ArrayList和LinkedList还有什么异同?继承关系上(这东西真没怎么注意过)

ArrayList和LinkedList都实现了List接口。
ArrayList直接继承于AbstractList;同时实现了RandomAccess接口,支持随机读。
LinkedList通过AbstractSequentialList间接继承于AbstractList,通过顺序读模拟了“随机读”;实现了Deque接口,可以作为双端队列使用。

说一说HashMap

HashMap内部数据结构是一个数组+链表/红黑树。获取数据时,根据key的hashCode计算出数组中对应的索引值,再遍历链表通过equals方法找到key对应的具体数据。索引计算公式是

链表什么时候会转换成红黑树?

链表长度大于8且节点数量多余64个(9.6补充,这点很多人没注意到,在treeifyBin方法中

JDK1.7和1.8下,链表插入方式有什么不同?

JDK1.7使用头插法,JDK1.8使用尾插法

为什么一个使用头插法,一个使用尾插法?

头插法性能更快,尾插法可以在插入数据时根据链表长度判断是否需要转换为红黑树(一开始答为了解决1.7下形成循环链表的问题,面试官再次强调问什么时候会转换成红黑树,转换红黑树才是尾插法的最主要原因)。


面经写一半通知面试过了,有点意想不到,我的表达逻辑太乱了,竟然也能过。泪奔~~~

2021.8.26二面
二面是技术和hr交叉面,都是基于项目问的,主要内容是项目设计并提需求。
目前记得比较清楚的两个问题:

你觉得你之前的这个支付系统有什么地方需要优化的?

1、引入redis和MQ,redis做商户/渠道信息管理,MQ处理订单循环查询阻塞问题及订单异步入缓存
2、拆分支付逻辑

看你对接的渠道有支付宝,如果让你设计支付宝针对客户端超时请求的处理,你会怎么设计?

检查请求参数,进行幂等性检查,失败返回订单已存在,否则按正常请求处理。

总共两面,已过,正在评审资料中。。。

更多模拟面试

全部评论

(10) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

近期精华帖

热门推荐