字节跳动凉经分享
面试官年纪中年,有点地中海,想必肯定是个大佬吧。还在酒店,房间昏暗。
然后常规的自我介绍结束了之后就开始项目介绍,我的项目用户量太小了,数据量也小。用户量几万,数据量最大的百万级别。哭唧唧。🥹。面试官心想,量这么少,如果量大一点咋搞。是不是得分库分表。不了料,面试官问分库分表怎么分?我说因为我们是TO B的业务,根据商户分表最合理。然后又问,不一样的商户数据量不一样大,数据分布不均匀,怎么处理。我答,这些交给stardingJDBC吧。又问自己弄,咋搞?我答,那就让商户数据量小的都分到一个表里面。又问,怎么做呢。我说用一致性Hash吧。话说一致性Hash压根也不能解决这个问题啊,又问一致性hash算法。我勉强回答了一下。(心想:你倒是给我讲一个)。然后又问一致性hash主要是为了解决什么问题,我回答的两点:1.散列;2.保证新加入节点是对其他已经被散列数据最小。这个感觉答的还是比较好。然后问了下对账,对账我就聊了下对账的业务和技术实现。面试官好像也不太感兴趣。然后草草的结束了项目考察。
然后就开始了常规的技术基础考察。虽说是技术基础,我只能说是真的基础,不浮于表面。问:一个Java对象的创建过程。这个即考察了字节码的加载、类加载器的机制和类的初始化,又考察了JVM的内存结构以及对象的初始化过程。面试官顺着这个问题接着问了双亲委派、GC等相关知识。Spring 主要问了个循环依赖的处理机制。但是我没答上来。然后又问到了Redis的高可用。我答了两点:1.主从复制,保证数据不会因为主节点宕机而丢失;2.集群部署。另外面试官补充问了Redis单点故障后怎么处理,我说采用一致性Hash,将故障节点的数据重新散列到可用的写节点。但是面试官说一般不要采取这样的方法,可以采用哨兵的模式。加上我说的两点,基本可以保证Redis的高可用。说完Redis,接着就聊数据库了,这个也是我准备的比较好的。问:MySQL的隔离级别和每个隔离级别所解决的问题。这些都能很好的回答上来,然后又继续追问了MySQL具体是如何解决幻读问题的。我答:序列化的隔离级别或者MVVC+间隙锁。然后我大体把MVVC的细节和next-key lock 的细节聊了一下。接着又聊到B+树,聚簇索引的实现。聊完以上这些,时间也差不多了,面试官出了一道算法题,多线程有序重复打印123的问题,我直接用volatile变量控制顺序,结果只能输出一次123。原因待深究。可能是死锁了!哎,凉经到此!