我的简历
本篇写点什么?
9/6被飞书狠狠地拷打,发现自己对简历上写的内容可以说完全不够熟悉,因此本篇将对我简历提及的内容,在每一个可能会被拷打的点上给出针对性的答复,以及可能出现的场景吧,我觉得这是熟悉简历的一大关键点
从专业技能到项目描述,每一个条记录一些对应的信息
专业技能
1.扎实的Java基础,熟悉集合,多线程,常用api,异常机制,反射等,具备良好的代码风格;
唠唠:
这一点没啥好说的好像,后续想到啥补充啥吧
2.熟练掌握Spring,SpringMVC,MyBatis,SpringBoot,SpringCloud常用框架,并基于此 封装脚手架;对于Spring的IOC、AOP,MyBatis的缓存机制、动态SQL等有基本了解;
唠唠:
3.熟悉MySQL底层存储结构,索引,事务,mvcc工作原理,能够编写常用的SQL语句及简单的SQL优化;
唠唠:
4.熟悉常用的NoSQL数据库,如Redis,熟悉五种基础数据类型,缓存持久化,集群模式,分布式锁等;
唠唠:
5.了解几种设计模式的使用,包括但不限于单例、模板、工厂、策略、适配器模式等,并在项目中有过使用
唠唠:
###6.了解RabbitMQ相关知识,了解持久化机制,消息可靠性,延迟消费等问题解决方式;
唠唠:
7.了解JVM基本知识,如运行时数据区域、类加载机制、垃圾回收机制等。
唠唠:
项目经历
主要针对两个项目中的工作职责来回答,还要提出项目的关键点(比如实现哪个逻辑的时候给你印象比较深刻?有没有哪个bug非常让你苦恼?怎么解决的?)
面试需要埋钩子,你需要把面试官一步一步引导到你实现做好了充分准备的点子上
APE-FRAME
1.参与框架的架构设计,技术选型,调研业务场景,负责框架的缓存模块和MyBatis模块;
唠唠:
2.采用模块化思想,对项目模块进行拆分设计,模块可插拔,可按需选择模块装载,模块间解耦;
唠唠:
3.封装多种工具类,分布式锁**,**数据归档,百万级导出组件,编写示例代码;
唠唠:
4.集成常用中间件mysql,redis,es,mq,xxljob等,并提供集成demo和starter封装;
唠唠:
鸡翅Club
1.选取主流鉴权框架 Satoken来替代传统的secruity ,提高开发效率,降低上手难度;
唠唠:
2.采用 Gateway 配合 redis 实现统一的鉴权及分布式会话共享功能,在网关层实现统一的全局异常处理;
唠唠:
3.为了 解决原有部署多机器拖拽jar包的痛点,采用 Jenkins配合shell脚本实现多机器自动部;
唠唠:
4.整体项目中间件采取 Docker形式进行容器化 搭建,配合 数据挂载 实现重要数据抽离;
唠唠:
5.采用 元数建模配合easycode 实现模型搭建及代码自动生成,提升原有建模效率;
唠唠:
6.登录模块 抽取微信微服务,实现 微信的对接回调与sdk的统一封装,沉淀出无业务性的微信对接服务;
唠唠:
7.重构原有复杂代码,采取 工厂+策略模式 实现 微信不同消息类型 的解耦处理;
唠唠:
8.独立从0到1通过 云服务器搭建整体项目 的环境及各依赖的安装;
唠唠:
9.封装了 自定义的线程工厂,实现了线程池间的日志区分,提升了 日志排查效率;
唠唠:
10.基于 futuretask 及 completablefuture 实现了分类标签的并发查询,提升 整体性能;
唠唠:
你能描述下没有用多线程时分类标签的查询流程吗,具体耗时情况是怎样的?为什么采用多线程的方式可以加快?
TIP
这个问题,首先要给面试官解释清楚查询的流程,为什么慢,然后是说明你多线程查询为什么快,可以参考下面的回答
queryCategoryAndLabel
方法:- 该方法是查询分类及其标签的入口。
- 首先从
SubjectCategoryBO
中获取分类的id
,并生成缓存键cacheKey
。 - 使用
cacheUtil.getResult
从缓存中查询分类及其标签信息,如果缓存中没有,则通过回调getSubjectCategoryBOS(id)
获取数据。
getSubjectCategoryBOS
方法:- 该方法用于根据分类 ID 查询该分类及其下的标签信息。
- 首先构造一个
SubjectCategory
对象,用于查询所有属于该分类的子分类,并过滤掉已删除的分类。 - 查询结果后,将其转换为
SubjectCategoryBO
对象的列表。 - 然后,使用
CompletableFuture
异步查询每个分类下的标签信息。每个分类下的标签查询操作在getLabelBOList
方法中执行,并在一个独立的线程池labelThreadPool
中进行。 - 所有的标签查询结果存放在
map
中,最后将标签信息与对应的分类绑定起来。
getLabelBOList
方法:- 该方法负责为给定的分类查询其关联的标签。
- 通过
SubjectMapping
对象查询该分类下的标签 ID 列表。 - 如果找到标签 ID,则通过
subjectLabelService.batchQueryById
批量查询标签信息,并将其转换为SubjectLabelBO
对象列表,最后将标签信息放入labelMap
中。
关键流程总结:
- 从缓存中获取分类和标签信息,若不存在,则进行数据库查询。
- 异步处理标签查询:为每个分类异步查询标签,提升查询效率。
- 结果合并:将查询到的标签绑定到相应的分类对象中。
代码的总体目的是通过分类 ID,查询该分类及其下的子分类,并为每个分类获取其对应的标签列表,最终返回分类与标签的完整数据结构。
11.使用 threadlocal 配合 网关拦截器,feign拦截器,封装用户上下文全局工具;
唠唠:
12.针对高并发接口,采取了 guava本地缓存配合函数式编程**,**泛型封装本地缓存工具,提升性能及通用性;
唠唠:
13.选取 xxl-job配合redis的hash接口 实现 点赞收藏 功能的开发及数据持久化,减轻数据库交互压力;
唠唠:
14.基于redis的 zset实现实时排行榜 功能,解决传统数据库大量交互的瓶颈点;
唠唠: