面试时介绍项目亮点的思路

面试时介绍项目亮点抓不住重点,一团乱麻?可以考虑从下面几个点出发,逻辑清晰,也能体现自己的思考

每个点讲几分钟加起来也能有小二十分钟,有效避免八股盛宴

具体是什么业务场景

有什么业务和技术上的瓶颈

你做了什么,怎么做的

遇到了什么问题,怎么解决的

有什么收益,怎么量化的收益

过程中有什么成长

举一个黑马点评的例子:

1. 业务场景

黑马点评的核心功能包括探店笔记发布、点赞、关注推送。比如用户发布探店笔记时,需要上传图片、索引内容到数据库,并展示用户头像、昵称、点赞状态。点赞功能需要处理高并发,同时展示点赞排行榜(按时间排序)。关注推送则是用户关注的达人发布新笔记后,粉丝能实时看到动态,用Redis的sorted set实现按时间分页查询

2. 技术瓶颈

  • 数据库压力:点赞频繁导致MySQL频繁执行UPDATE和查询,出现慢查询和锁竞争(TPS仅500)。
  • 缓存穿透/雪崩:高并发查询未缓存的数据(比如新用户查不到笔记),导致数据库被打满。
  • 分布式锁问题:秒杀一人一单场景下,本地锁(如synchronized)在集群中失效,导致超卖。

3. 解决方案与实施

点赞优化

  • 用Redis的sorted set替代普通set,用时间戳作为score,实现点赞排行榜的排序和分页查询。
  • 解决分页顺序错乱:通过SQL的ORDER BY FIELD强制按Redis返回的ID顺序查询用户信。

缓存问题

  • 穿透:缓存空值并设置随机过期时间(比如缓存NULL,过期时间30秒±5秒)。
  • 击穿:热点数据加锁,比如用Redis的SETNX实现互斥锁,保证只有一个线程重建缓存。

分布式锁

  • Redisson替代自研锁,解决可重入、锁续期问题。比如秒杀时,通过RLock锁用户ID,确保集群环境下的一人一单。

4. 遇到的问题与解决

问题1:分页查询顺序错乱

  • 现象:从Redis sorted set查到的用户ID顺序正确,但数据库用IN查询后顺序乱了。
  • 解决:改SQL为ORDER BY FIELD(id, a,b,c...),强制按传入ID顺序返回结果。

问题2:事务失效

  • 现象@Transactional注解在同一个类的方法调用时不生效。
  • 解决:用AOP暴露代理对象,通过AopContext.currentProxy()调用方法。

5. 量化收益

  • 性能提升:点赞接口QPS从500提升到8000,响应时间从200ms降到50ms。
  • 业务指标:秒杀活动超卖投诉率降为0,GMV增长320%。
  • 稳定性:缓存穿透导致的数据库压力下降90%。

6. 个人成长

  • 技术深度:搞懂了CAP理论和最终一致性,比如用消息队列异步更新缓存和数据库,通过实现基于 Redisson 的分布式锁(含可重入、看门狗续期机制),结合 Lua 脚本保障原子性,优化锁粒度(如按商品 ID 细化),解决了超卖、锁误删及主从一致性问题
  • 踩坑经验:学会用ThreadLocal存用户信息,避免在多线程中传递参数。
  • 协作能力:和前端联调时发现分页顺序问题,最终通过SQL优化解决,沟通效率提升。
全部评论
mark住业务场景
点赞 回复 分享
发布于 06-12 16:12 上海
mark
点赞 回复 分享
发布于 06-09 13:26 北京
mark住业务场景
点赞 回复 分享
发布于 06-06 19:29 河南
mark住业务场景
点赞 回复 分享
发布于 04-24 00:34 黑龙江
m
点赞 回复 分享
发布于 04-23 13:25 北京
mark住业务场景
点赞 回复 分享
发布于 04-23 12:57 山西
mark住业务场景
点赞 回复 分享
发布于 04-23 12:05 四川
mark住业务场景
点赞 回复 分享
发布于 04-09 16:13 重庆
mark住业务场景
点赞 回复 分享
发布于 03-28 21:14 上海
mark
点赞 回复 分享
发布于 03-27 20:55 北京
mark住业务场景
点赞 回复 分享
发布于 03-27 02:06 重庆
mark住业务场景
点赞 回复 分享
发布于 03-26 23:41 河北

相关推荐

头像
05-24 15:08
门头沟学院 Java
面试官很厉害,全程没有问我项目,就问八股。我很菜,八股没办法延申太多,答的都快红温了,感觉要寄,但是最后面试官说我体系搭的还行,心里还是有点小开心。----------------------------1.平时用的开发工具是什么?(不太懂问这个干啥)答:IDEA。(感觉可能想问我一下有没有用过cursor,但是本人确实没怎么用过,hh)2.MAVEN中<dependencies>和<dependencyManagement>有什么区别?3.LinkedList底层数据结构是什么?4.ArrayList和LinkedList都可以用get加一个数字来获取里面的一个元素的对吧?5.ArrayList和LinkedList都有10000个元素,它们都是用get(9999)获取元素,性能上有什么差别吗?6.如果对于存储了10000元素的LinkedList用get(9999)的话,时间复杂度是多少?7.平时开发的时候有没有遇到过OOM问题?8.JVM是如何判断一个对象能否被释放的?9.Object有哪些私有的方法?10.Object有哪些常见的方法?11.一个对象强转为String和使用String.valueOf有什么区别吗?12.String的String.valueOf的重载有多少个?实际上面试官应该是想问我重载的分类13. 有用过事务吗?你的事务用在什么地方,是为了解决什么问题呢?14. 一个方法里有多个读写操作,一开始没加事务注解,加了后性能有什么变化吗?(牛友们有更好的回答吗?我目前只想到这个,但是不太清除会出现在什么业务场景)答:有可能更快,有可能更慢。更快的情况是数据竞争不激烈,那么加了事务注解的方法只需一次网络IO,而不加事务的要多次网络IO。更慢的情况下是数据竞争激烈时,如果有很多事务提前抢占一些资源,导致加锁后其他的事务无法获取,等待的事务比较多,就会有可能会更慢。相比之下,一次一次提交的方法每次抢占的资源比较少,反而等待的事务比较少,可能更快。15. 现在有1w个员工,请你按照他们的年龄给他们排序,我们不关注他们原先的顺序,只要是按年龄顺序排序即可。创建一个大小为100的ArrayList<ArrayList<Employee>>,然后对应年龄的员工插入即可,最后遍历。时间复杂度应该是O(n)的。
众安保险一面59人在聊 查看14道真题和解析
点赞 评论 收藏
分享
评论
22
169
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务