VIVO 一面
讲讲你的这个批量导入功能是怎么实现的?
你说的这个监听器是监听什么?
其中的涉密字段转换是怎么转换的?主要是哪些字段转换?
有没有做过批量导出功能呢?假如现在有百万级的数据需要导出,怎么做呢?
没有做过
如果是实现批量导出的话,监听器和实体类的DTO是要重新构建的,还需要再在程序外套一层IO文件输出流的逻辑。
如果现在思考如何实现的话,首先可能需要对数据源进行划分,再通过多线程结合JUC的信号量来进行实现批量导出。
对于百万级别的excel数据的导入,如何优化?
导入的痛点:一次加载百万级别数据到内存,发生OOM
如果一条条循环插入,数据库链接不够用
导出的痛点:
一次查询百万条数据,mybatis查询超时报错
一次加载百万条数据到内存,发生OOM
写到一个Sheet中,打不开
一行一行的写入到Excel,频繁的io操作,CPU飙升
操作高峰期,系统容易内存溢出
解决方式
1、选用合适的excel开源处理框架阿里的 easyexcel
2、百万级别导入方案
逐行解析excel数据,分批读取excel数据放到list,list达到一定数据量持久化到DB,同时清空list列表数据
采用MyBatis的foreach批量保存、myBatis plus批量saveBatch方法保存、spring jadbcTemplate,不过记得配置连接池参数要加上 rewriteBatchedstatements=true
3、百万级别导出方案
分批分页查询db数据到内存,比如一次查询5000条,分20次分批查询出来
每次加载指定大小的数据到内存,比如每次5000条,5000条批量写入到excel以后,清空当前list,释放内存.分多个sheet写入,每个sheet比如放20w,100百万数据放到5个sheet
每次从数据库批量读取指定大小的数据写入到excel,比如每次5000条
4、解决高峰期导入导出资源瓶颈
、从产品侧设计的时候,引导产品,将导入导出功能设计成异步,尽量不要同步等待,虽然牺牲了一点体验,但是长期看对系统的稳定非常重要。(为了产品的体验,可以提供一个统一excel导入导出历史记录功能给产品或运营同学,支持查看对应的下载进度,可追溯)
.前端导入导出按钮控制操作的频率,比如10分钟内不能频繁导入导出。
.后端导入导出采用MQ异步排队处理,防止把内存写爆,CPU打满。
,采用动态配置开关控制导入导出的数量,通过压测预估系统处理数据的阈值默认配置一个,导入导出超过阈值需要产品或运营发邮件申请,开发修改配置,如果业务确实有超大数据量要求,超过阈值太多,引导产品或运营分批导入导出解决。
讲讲你下个项目中的这个主要是做了什么?
回答更新了RABC,需要将老旧方法进行更新,如果对有关Redis中的缓存数据进行了更改,就需要对缓存数据进行实时更新。
主要是通过AOP的注解与Spring的缓存注解结合完成的。
SpringBoot有哪些常用的注解?
1.SpringBoot为什么启动那么快?
Spring Boot之所以能够帮我们简化项目的搭建和开发过程,主要是基于它提供的起步依赖和自动配置。
SpringBoot 的诞生就是为了简化 Spring 中繁琐的 XML 配置,其本质依然还是Spring框架,使用SpringBoot之后可以不使用任何 XML 配置来启动一个服务,使得我们在使用微服务架构时可以更加快速的建立一个应用。
2.SpringBoot starter有了解过吗?有自定义过吗?
starter简单来讲就是引入了一些相关依赖和一些初始化的配置。
Spring官方提供的starter名称为:spring-boot-starter-xxx 例如Spring官方提供的spring-boot-starter-web
第三方提供的starter名称为:xxx-spring-boot-starter 例如由mybatis提供的mybatis-spring-boot-starter
3.在Spring中,对控制反转有了解吗?
4.那为什么在项目里不直接New一个对象,而是采用IOC的方式来进行对象的创建?
5.在容器里装载Bean,通过哪些方式可以对Bean进行获取?
6.条件注解有了解过吗?根据不同的条件来装载Bean
7.Spring怎么来配置事务了解吗?
8.Controller层和Service层也是对象,是不是在容器里管理?
9.对Controller这一层来说,使用它的时候是不是单例作用域?
10.Mybatis操作数据库的原理和JDBC什么关系?
底层还是JDBC来做的
11.Mybatis的缓存层级
12.项目中的用户登录是怎么做的?
13.Session管理的登录态,讲讲Session和Cookie的区别
14.Session每次请求都会带一个SessionID,产生的过程是什么样的?
Session要标识这个请求,服务端来生成,后面每次请求都会带上这个SessionId来标识是同一个请求。
15.Session管理的机制,怎么实现的?
16.你使用Redis主要存储什么数据?
17.Redis可以存储哪些类型的数据?
18.Java里面如何操作Redis?
19.Redis配置的时候需要配置哪些内容?
IP+Port
20.那里用到了Kafka?
21.毕业有论文要求?能正常毕业吗?
22.工作地点有要求吗?
23.手头有Offer吗?
反问:
1.面试官你要不要考察一下数据结构与算法?
今年还是比较难,Vivo的编制比较紧张
2.哪些强化一些比较好?
Spring了解的不是很透彻,所有的应用开发Spring是基础,加强一下。