Skip to content

我的简历

本篇写点什么?

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

    这个问题,首先要给面试官解释清楚查询的流程,为什么慢,然后是说明你多线程查询为什么快,可以参考下面的回答

    1. queryCategoryAndLabel 方法:

      • 该方法是查询分类及其标签的入口。
      • 首先从 SubjectCategoryBO 中获取分类的 id,并生成缓存键 cacheKey
      • 使用 cacheUtil.getResult 从缓存中查询分类及其标签信息,如果缓存中没有,则通过回调 getSubjectCategoryBOS(id) 获取数据。
    2. getSubjectCategoryBOS 方法:

      • 该方法用于根据分类 ID 查询该分类及其下的标签信息。
      • 首先构造一个 SubjectCategory 对象,用于查询所有属于该分类的子分类,并过滤掉已删除的分类。
      • 查询结果后,将其转换为 SubjectCategoryBO 对象的列表。
      • 然后,使用 CompletableFuture 异步查询每个分类下的标签信息。每个分类下的标签查询操作在 getLabelBOList 方法中执行,并在一个独立的线程池 labelThreadPool 中进行。
      • 所有的标签查询结果存放在 map 中,最后将标签信息与对应的分类绑定起来。
    3. getLabelBOList 方法:

      • 该方法负责为给定的分类查询其关联的标签。
      • 通过 SubjectMapping 对象查询该分类下的标签 ID 列表。
      • 如果找到标签 ID,则通过 subjectLabelService.batchQueryById 批量查询标签信息,并将其转换为 SubjectLabelBO 对象列表,最后将标签信息放入 labelMap 中。

    关键流程总结

    1. 从缓存中获取分类和标签信息,若不存在,则进行数据库查询。
    2. 异步处理标签查询:为每个分类异步查询标签,提升查询效率。
    3. 结果合并:将查询到的标签绑定到相应的分类对象中。

    代码的总体目的是通过分类 ID,查询该分类及其下的子分类,并为每个分类获取其对应的标签列表,最终返回分类与标签的完整数据结构。

11.使用 threadlocal 配合 网关拦截器,feign拦截器,封装用户上下文全局工具;

唠唠

12.针对高并发接口,采取了 guava本地缓存配合函数式编程**,**泛型封装本地缓存工具,提升性能及通用性;

唠唠

13.选取 xxl-job配合redis的hash接口 实现 点赞收藏 功能的开发及数据持久化,减轻数据库交互压力;

唠唠

14.基于redis的 zset实现实时排行榜 功能,解决传统数据库大量交互的瓶颈点;

唠唠

其他问题

1. 你的项目经历中影响很深的bug有哪些?

技术漫游

本站访客数 人次 本站总访问量