本来年前就该整理的,前公司项目忙不过来,办完离职被前领导喊着帮忙干了一周活,然后距离过年不到三周确实没啥岗位了,哈哈,摆烂到现在…
上海 中级Java开发工程师 13-20K
岗位职责:
1、参与业务流程分析并根据业务需求进行JAVA服务和应用程序开发、与前端同学协作实现业务模块设计与开发联调’
2、小组内负责开发规范的执行落地、团队工作任务协同和项目推进,当好技术带头人
3、 关键服务和模块的设计编写, 以及代码质量的review
4、 负责跟踪JAVA相关新技术并运用到程序开发中
5、 负责业务中台模块的开发和维护
任职要求:
1、全日制大学本科及以上学历(统招为硬性要求);计算机、通信等相关专业;三年以上工作经验;
2、精通Java编程,熟练掌握Java基础类库、设计模式、多线程、Socket等编程经验;
3、熟练掌握SSM、SpringMVC、 SpringCloud等常用开源框架;
4、熟悉分布式、缓存、异步等中间件使用,起码了解Redis、消息队列、RocketMQ,了解原理者优先;
5、精通SQL开发与优化,了解常用NoSql数据库;
6、了解设计原则与常用的设计模式;
7、具有模块设计能力和文档编写能力,并能带领小团队进行模块设计与开发。
8、较强的学习能力和积极向上的精神、工作积极主动勇于承担
视频面试 时长30分钟
1.自我介绍
2.你最近或最熟悉的项目是哪一个
3.你在里面的主要职责和详细设计能说下么
4.你可以说下商品缓存是怎么设计的么\
拿C端的菜单来说吧
首先需要做数据预热,也就是在项目启动或者低峰期时加载部分数据到redis缓存中,来提高缓存命中率
其次就是需要定期更新缓存,来保证缓存一致性
5.这里的缓存用到了几级
缓存层级一般是本地缓存>redis缓存>数据库缓存
6.商品缓存是把所有商品都缓存么
按门店级别缓存菜单商品,这样可以过滤掉大部分没用的商品
7.库存的并发有关注过么
用分布式锁控制,提示库存繁忙
或者用的rabbitmq异步更新数据库库存,可以削峰填谷
8.你们的库存是直接走库的是吧
有冻结库存、可售库存、安全库存这些设计,提交订单是更新redis缓存里面的冻结库存,支付成功时用mq异步更新数据库可售库存
9.锁定的库存是怎么设计的,就是什么时候处理冻结库存
提交订单时增加冻结库存,订单支付成功或订单超时未支付时释放冻结库存
10.有考虑过防超卖的设计么
当可售库存低于安全库存时,会发告警邮件或短信给负责人,库存操作会记录日志盘点库存
11.你们异步用的是rabbitmq,有考虑过消息丢失或者消息重复发送这些
消息丢失
① 标记消息持久化,让消息能够在重启后恢复
② 消息重试机制
③ 设置死信队列来保证无法成功消费的消息不会被丢失
④ 监控系统,定期检查消息队列是否正常
消息重复发送
① 消费端幂等处理,保证重复发送获取的结果一致
② 采用唯一标识符,去重处理
③ 手动ack
12.订单有没有可能丢失呢
很少应该是
13.订单部分发货什么逻辑
商家发货后在后台点击发货,选择发货商品输入物流单号
系统设计逻辑,表方面是有订单表基础上新增订单发货商品信息表,根据商家操作商品判断部分发货还是整单发货,修改订单状态信息,保存订单发货商品信息,并异步丢消息到mq修改订单缓存信息
14.mysql8的版本和之前的版本有啥区别
① 数据库的缺省编码将改为 utf8mb4,这个编码包含了所有 emoji 字符
② InnoDB存储引擎的改进
③ 性能和安全性增强
等等
15.平时你们是怎么排查线上问题
在elk看日志
16.比如如果出现库存超卖了你们平时是怎么处理的
库存不足会告警提示相关负责人
扣库存也会记录日志
17.mysql聚簇索引、非聚簇索引
聚簇索引(Clustered Index)和非聚簇索引(Non-clustered Index)是两种不同类型的索引结构,它们在数据存储和索引构建上有一定的区别。
1. 聚簇索引(Clustered Index):
- 聚簇索引是一种按照索引顺序存储数据的方式,索引的叶子节点就是数据节点。
- 聚簇索引决定了表中数据的物理存储顺序,一个表只能有一个聚簇索引。
- 当按照聚簇索引进行查询时,MySQL 可以直接通过索引找到对应的数据行,效率较高。
2. 非聚簇索引(Non-clustered Index):
- 非聚簇索引存储的是索引字段的值及指向实际数据行的指针,而不是实际的数据。
- 表中可以有多个非聚簇索引,它们并不影响数据的物理存储顺序。
- 当按照非聚簇索引进行查询时,MySQL 首先通过索引找到对应的行指针,然后再根据指针找到数据行,需要进行两次查找操作。
18.mysql优化sql操作流程
elpain执行计划,观察key字段有没有用到索引,len字段长度,row涉及行数,观察有没有走到索引
19.索引数据结构
btree、hash
20.mysql隔离级别
读未提交
读已提交
可重复读
序列化
读已提交和可重复读是比较常见的隔离级别,能够在保证数据一致性和并发性能的基础上,兼顾事务处理的效率
mysql默认隔离基本是可重复读
21.redis几种数据类型、使用场景
string list set hash zset
string 缓存值、分布式锁等
list 有序字符串元素集合,用于消息队列、消息列表等
set 不重复无序元素集合,可以用于标签系统之类的
zset 不重复有序元素集合,可以做排行榜
hash 字段-值的形式存储,可以用于存储门店信息等
22.分布式锁用的哪一种
用的redis的string数据类型实现的
分布式锁可以用来防止重复点击、防止穿透等
23.setnx怎么保证锁过期后任务没执行完
一般设置过期时间都是根据业务考虑好的,如果确实有不确定的情况,可以在执行任务期间定时更新锁过期时间,在任务执行完后释放锁
24.springcloud组成结构
zuul hytrix熔断 ribbon限流 eureka注册中心 nacos注册中心
25.eureka、nacos区别
nacos还可以做配置中心
26.系统中有用到什么设计模式
单例模式、模板模式、工厂模式、
27.系统中有创建多线程么
**不推荐使用Executors创建线程**,无界队列可能会造成内存溢出
推荐使用new ThreadPoolExecutor()的方式,根据服务器核心数自定义线程参数
28.多线程的核心原理有了解过么
29.了解过JVM么
调优常用的-xms -xmx调整堆内存大小
30.线上有出现卡顿或者性能上的问题通过什么方式去看的
java自带的那个**jvisualvm** ,dump那个文件 用工具去看是哪个类比较大定位位置
阿里巴巴那个arthas(阿尔萨斯)
31.hashmap、cucurrentHashmap区别
hashmap线程不安全
cucurrenthashmap线程不安全 高并发时候使用
32.hashmap7和8区别
数据+链表
后来加了红黑树
33.平时会看源码么
34.目前有啥记得的熟悉的源码
SpringBoot项目中有个注解@SpringBootApplication,这个注解是对三个注解进行了封装: @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 其中@EnableAutoConfiguration是实现自动化配置的核心注解。 该注解通过@Import注解导入AutoConfigurationImportSelector类,这个类实现了一个导入器接口ImportSelector。 在该接口中存在一个方法selectImports,该方法的返回值是一个数组,数组中存储的就是要被导入到spring容器中的类的全类名。 在AutoConfigurationImportSelector类中重写了这个方法,该方法内部就是读取了项目的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。 在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中
35.平时中项目中的定位和角色是什么
功能开发然后带带新人啥的
36.你能接受项目急的时候加班么
不是每天都加就还好
37.你有什么要问我们的么
了解到是年底启动的新项目,规模是有十几个开发的,技术方面用的也是mysql、rabbitmq这些