背景

面试某C轮融资公司,主要业务是为各种大大小小的房屋中介公司提供二手房交易平台。

问题

  • 假设现在我们的数据库里的一张公司表数据量很大,千万级别的数据量,已经性能方面已经存在严重的问题了,需要做拆分,公司和地区有关联,一个公司会在多个地区有分公司,一个地区有多个公司,在库表拆分这方面,你怎么设计
  • 你了解过哪些分库分表的技术,有什么区别,如果要在原有的分库分表技术上做一层适用于公司的封装,你打算怎么做,如果我的应用,在读操作上,会频繁切换数据源,你觉得这有没有什么问题,如果我希望分库分表的分片键可以灵活切换,你会怎么做
  • 一个ArrayList,使用i=0;i++这种方式遍历,在遍历过程中删除其中的数据,有没有问题,倒序删除有没有问题,有没有别的方法可以安全的删除其中的数据
  • Spring boot怎么做自动装配的,现在spring boot最新是什么版本了,Autowired和Resource有什么区别,如果用Resource,类型名称不一样,类型一样能不能找到,读过源码么,Spring里面你还知道哪些常用的注解,都是干什么用的
  • 你了解JVM,JVM里面有哪些收集器,有什么区别,如果对项目的垃圾收集器做选型,你会从哪些方面考虑
  • 数据库索引上,比如我现在有个字段,里面只会有1,2,3这三个值,适不适合建索引,为什么,你有实践过么
  • 说说你平时怎么学习的,自己有购买过一些技术课程么
  • Java里面的容器类你知道哪些,Set是怎么实现唯一性的,读过源码么,HashMap有些什么缺点,线程安全的Map你知道哪些
  • redis有哪些数据结构
  • mybatis缓存了解么,你们实际项目中用到了么,用到什么程度

回答

  • 询问面试官,对于这张表,主查询条件是什么,面试官既有公司,也有地区,提出做水平分库,水平分库,除了可以增加容量,还可以减轻单个mysql实例的读压力,根据这张表做两套异构的拆分,一套以公司作为分片键,一套以地区作为分片键。
  • 说了mycat,shardingsphere, mycat和sharding都是作为数据库和业务之间的代理层,根据框架提供的API,进行进一步适用于公司的封装,切换问题没答上来,切换分片键方面,会采用配置的方式,通过读取配置文件的配置进行处理(其实问题答得太笼统,应该从单机层面,说说具体实现方式,比如读取配置文件后,可以通过热加载,重新加载对应配置类,分布式情况下的实现方式,比如使用配置中心同步配置,更新服务本地配置)。
  • 删除的时候,会因为FailFast机制,报错,倒序删除不会有问题。(但其实常规for循环使用list本身的remove方法删除不会报错,迭代器遍历时用list.remove会报错),安全删除,可以用迭代器迭代删除,list的removeif方法也可以
  • spring boot自动装配是通过类似spi的方式,配置spring.factory文件进行装配,版本2.4,autowired先跟据类型找,找不到再根据名称来找,resource反之,所以resource的那个问题,类型是相同的话,就可以找到,说了component, bean,import, configuration注解。
  • 列举了jvm中的,serial,serial old, parallel gc ,parnew,cms,g1, parallen scavenge, zgc收集器,根据应用的吞吐量和延迟要求,先进行收集器的选择,其次在考虑参数调优
  • 1,2,3本身区分度太低,不适合建立索引,试过用性别字段建立索引,效果不行。
  • 学习,主要是看官方文档,对于比较成熟的技术,会结合网上搜索的文章学习
  • 随便说了常用的arrayList,hashMap,hashSet,set内部依赖了map,使用了map的key实现唯一性,hashMap线程不安全,线程安全的map说了concurrentHashMap。
  • 说了redis的5个基础数据结构。
  • mybatis介绍了下1级缓存和2级缓存,实际项目中只用了一级缓存

总结

面试官除了考察一下技术,也比较关注候选人的学习途径,学习的自主能动性。
很多开放性的问题,比如分库分表设计,jvm的gc收集器选型,框架封装的想法啊这类问题,思路还是不够开阔,在面试的时候,遇到面试官问这类问题,不要慌,第一时间想不出来解决方案,可以慢慢思考下问题本身,解决这个问题核心要解决什么,如果核心问题不能解决,有没有曲线救国的方法,如果解决办法很多,不一定要求最优解,可以把想到的办法都先说出来,跟面试官沟通下,慢慢排除不合适的,想不出来可以试着跟面试官沟通,从面试官那里获取一些跟问题直接相关的有用的信息,慢慢挖掘问题,切记不可因为一时想不出来乱了阵脚。

Q.E.D.