恩希云 一面 JAVA 社招两年 面经

两道算法题 讲思路(第一道ac,第二道优化思路没想到)有一道让我判断 abcd第一个不重复的元素我说的 当遍历到a时 检测字串bcd有没有重复元素面试官时间复杂度为 平方n 有没有优化思路?

.....没想到,点了?

面完想起了 统计个数

  1. 介绍一下你自己

面试官:请做一下自我介绍。

  1. 面试题

Q1说一下行锁升级为Redis分布式锁的背景和实现方案。

回答:业务背景是多台机器执行异步任务,抢占任务竞争激烈,最终选择了Redis分布式锁而非乐观锁或MySQL行锁。

复盘答案:

对比行锁与乐观锁以及分布式锁的区别以及场景。行级锁: 主从也能用,就是 性能低乐观锁:

UPDATE task

SET status = 执行中, version = version + 1

WHERE status = 0

AND id IN (1,2,3,4)

可能导致 部分失败Redis分布式锁:保证一批任务的原子性,要么这一批全部抢占成功,要么全部失败。

Q1死锁是啥?

A:关于死锁,虽然我没遇到过,但知道死锁发生的四个条件:资源互竞争、资源不可剥夺、环路等待、请求保持。破坏条件的方式包括一次性申请完资源,或给锁设置过期时间做兜底。

复盘:

差不多

Q2Redis除了锁还用来做什么?

答:做消息查询的缓存,以及防重复消息。

追问:怎么解决缓存一致性问题?

周杰:Redis和MySQL本质解决不了实时一致性,我们采用最终一致性方案——延时双删。先删缓存,再更新数据库,然后再删一次缓存,前后两次删除保证缓存清除。

复盘:缓存一致性怎么保证

1.过期时间兜底2.更新mysql后删除redis

3.reids订阅mysql的bin log日志,使用阿里canal组件

Q3解释一下冷热数据。

答:我们有定时任务(每小时、每分钟都有),业务真正需要观测的是即将发生的事件(近2小时内),其他属于冷数据。我们把近2小时的时间点放入Redis,用适当数据结构不断检查是否到点,到点就拿出来给执行层。冷数据有迁移服务不断生成后面要执行的数据,存在数据库里。

复盘:

差不多

Q4任务量大时怎么处理?

答:考虑过分表问题。调研过美团、阿里的组件,但我们想做自己有分库分表能力的方案。做了个治理服务,当表大于400万(阿里推荐500万,我们选400万做缓冲)时就重新分表,新任务在新表执行,旧表保留执行记录。冷数据直接归档,热数据(单表内容)用ES解决大表查询问题。

复盘:

应该回增加worker执行者机器的。(这里应该 面试就寄寄了)

Q5离职原因?之前工作强度怎么样?

答:是的。当时主要是家里母亲要手术,公司不能请长假,我也请了很多次假,最终主动离职。在休息期间也在自学技术、看专业书籍。

答压力比较大,工作压过来时,有时候周天晚上10点钟也在开会,有点累了。但其实感觉还可以,就是一个一个任务完成,有攀越高峰的感觉。

面试官:你用Claude Code做什么?

答:来需求后,先讲清楚任务背景和角色(用提示词工程)。比如找开源项目时,会让Claude总结项目、生成README。如果是开发数据面板,会mock假数据。也会用来做单测。

复盘:1.首先用plan模式 生成 整体框架

2.生成前要求清楚 明确技术栈、项目要求、功能点

3.生成 CLAUDE.md 方案文档

4.起一个子代理 检查、写单测

5.skills优化(具体用啥skills还在网上学)

大体这几个架构、Code Review、单元测试、Spring Boot、微服务

Q6线程池用的啥:

fixed线程池

核心参数7个:最大线程数、核心线程数、阻塞队列、最大超时时间、超时时间单位、线程工厂、拒绝策略。

分配流程:先创建线程,看核心线程是否满载。满了进阻塞队列(无界队列直接进),队列满了再扩到最大线程数。最大线程数也满了就进入拒绝策略(默认AbortPolicy)。

复盘:差不多

Q8

ThreadLocal:

本质是HashMap,给每个线程分配副本。

缺点是可能内存泄漏,因为Key是弱引用,键被删除后Value释放不了。建议设置为static或不要声明过多。

复盘:

1.threadlocal实现线程隔离,给每个线程分配副本(放弃源码解释了,记不清)2.内存泄漏问题,因为key是弱引用(GC触发就回收),value是强引用,当key的回收了之后,value就不会被回收。

解决方法: 用完remove

Q9

MySQL索引失效哪些:

最左匹配原则失效(模糊查询%在左边)。

函数计算导致失效。

范围查询导致后续索引失效(如a、b、c三个条件,b产生范围查询,c的索引失效)。

复盘:

Q10 MVCC介绍下:

答:解决读写冲突,与Undo Log一起实现ACID中的隔离性。

Undo Log每行隐藏两列:事务ID和回滚指针(指向上一个版本)。

Read View包含:当前事务ID、最大活跃ID、最小活跃ID、最大事务ID。

判断规则:事务ID小于最小活跃ID(已提交,可见);大于最大事务ID(未提交,不可见);在活跃事务列表中(活跃中,不可见)。

解决部分幻读问题,但解决不了当前读(快照读和当前读混用场景)。

复盘:

差不多Q12介绍下redis 故障转移

从节点不断探测主节点是否活着,如果认为主节点主观下线,且半数以上节点认同,就触发切换。

根据同步位置推选新主节点。

复盘:哨兵发起ping命令检测主节点,如果下线标记为主观下线,发起一轮投票,假如超过阈值,则标记为事实下线。

然后从优先级、复制进度、ID大小选择新的主节点。之后旧的主节点降级为从节点。

Q13Kafka怎么保证发送成功的

回答:消费者发送失败设置ACK为All(所有副本写入)。

复盘:

Q14 不断重试可能导致生产者发送重复消息答:消费端设置唯一业务ID去重。业务方去保证

复盘:

消费侧 新增数据库的话 唯一索引去重 ,更新的话,生成token 之后存入redis

Q15其他

会写Python,用过LangChain、Plotly、Pandas等库。

Q16如何排查服务挂掉了

Linux排查问题:先看TOP命令看CPU,再看是否死锁。用jstack打线程日志,搜Deadlock字段。先在Nacos看服务是否存活,

Q17服务响应慢如何定位?

用SkyWalking看链路哪阶段超时。

Q18kafka的重试策略?

点了?后面提示 重试次数

Q19redis的cluster中主从同步过程

点了?回家想起是ping pong机制

面试总结

感觉

问到kafka怎么解决重试问题的,不知道在问啥redis的cluster中主从同步过程,点了

寄寄寄

不足之处

Claude code 致命Threadlocal 真的记不住

全部评论
面了1h 面完等了15min 告知回家 应该是横向了
点赞 回复 分享
发布于 04-16 13:40 四川
一面没过
点赞 回复 分享
发布于 04-16 13:36 四川

相关推荐

上周组里招人,我面了六个候选人,回来跟同事吃饭的时候聊起一个让我挺感慨的现象。前三个候选人,算法题写得都不错。第一道二分查找,五分钟之内给出解法,边界条件也处理得干净。第二道动态规划,状态转移方程写对了,空间复杂度也优化了一版。我翻他们的简历,力扣刷题量都在300以上。后三个呢,就有点参差不齐了。有的边界条件没处理好,有的直接说这道题没刷过能不能换个思路讲讲。其中有一个女生,我印象特别深——她拿到题之后没有马上写,而是先问我:“面试官,我能先跟你确认一下我对题目的理解吗?”然后她把自己的思路讲了一遍,虽然最后代码写得不是最优解,但整个沟通过程非常顺畅。这个女生的代码不是最优的,但当我问她“如果这里是线上环境,你会怎么设计’的时候,她给我讲了一套完整的方案——异常怎么处理、日志怎么打、怎么平滑发布。她对这是之前在实习的时候踩过的坑。”我在想LeetCode到底在筛选什么?我自己的经历可能有点代表性。我当年校招的时候,也是刷了三百多道题才敢去面试。那时候大家都刷,你不刷就过不了笔试关。后来工作了,前三年基本没再打开过力扣。真正干活的时候,没人让你写反转链表,也没人让你手撕红黑树。更多的是:这个接口为什么慢了、那个服务为什么OOM了、线上数据对不上了得排查一下。所以后来我当面试官,慢慢调整了自己的评判标准。算法题我还会出,但目的变了。我出算法题,不是想看你能不能背出最优解。而是想看你拿到一个陌生问题的时候,是怎么思考的。你会先理清题意吗?你会主动问边界条件吗?你想不出来的时候会怎么办?你写出来的代码,变量命名乱不乱、结构清不清楚?这些才是工作中真正用得到的能力。LeetCode是一个工具,不是目的。它帮你熟悉数据结构和常见算法思路,这没问题。但如果你刷了三百道题,却说不清楚自己的项目解决了什么问题、遇到了什么困难、你是怎么解决的,那这三百道题可能真的白刷了。所以还要不要刷LeetCode?要刷,但别只刷题。刷题的时候,多问自己几个为什么:为什么用这个数据结构?为什么这个解法比那个好?如果换个条件,解法还成立吗?把刷题当成锻炼思维的方式,而不是背答案的任务。毕竟面试官想看到的,从来不是一台背题机器,而是一个能解决问题的人。
国企上岸了的向宇同桌...:最害怕答非所问了,但是频繁反问确定意思又害怕面试官觉得我笨
AI时代还有必要刷lee...
点赞 评论 收藏
分享
主包本2社招,估计是项目不太搭,一直在问我八股和项目中提到的技术点的八股延伸。面试官还是很好的,一边面试一边和我说存在的问题和需要强化的地方。已约二面以下由AI总结1.并发编程与JVM◦ 线程池的底层执行机制是怎样的?(具体流程:核心线程、队列、新增线程、拒绝策略)◦ 你偏好使用的队列类型(如LinkedBlockingQueue)是什么?设不设上限?◦ 线程池队列设置过大会带来什么风险?(内存溢出)◦ 如何排查线程池导致的内存溢出问题?◦ 请解释原子性(Atomicity)和可见性(Visibility)的概念。◦ HashMap在JDK 1.8中是如何保证线程安全的?(CAS和synchronized的具体应用场景)◦ HashMap的数据结构(链表与红黑树并存的必要性)和扩容机制是怎样的?2. 数据库与索引◦ 遇到MySQL慢查询,你会如何分析?(例如使用EXPLAIN)◦ 哪些情况会导致MySQL索引失效?(例如不满足最左前缀原则、对区分度低的字段建索引)◦ 硬查询结合ORDER BY是否会影响索引?◦ InnoDB索引的底层数据结构是什么?(B+树)◦ B+树相比红黑树有什么优势?(减少磁盘IO)◦ 顺序IO和随机IO的区别是什么?◦ MVCC(多版本并发控制)是如何工作的?3. 缓存与消息队列◦ 如何实现限流?(如Redis + Lua脚本实现的令牌桶算法)◦ 令牌桶算法有什么缺点?与漏桶算法相比如何?◦ 什么是缓存穿透、击穿、雪崩?对应的解决方案是什么?(如缓存空值、随机过期时间、互斥锁)◦ 如何防止热点Key过期导致的缓存击穿?(提及定时刷新、随机时间等方案)◦ 你提到的“双层缓存”(Caffeine + DB)具体是如何设计的?如何保证分布式环境下本地缓存的数据一致性?(提到了HTTP广播、Kafka)◦ Kafka如何保证消息的可靠性?(生产者确认、Broker持久化)◦ 如何避免Kafka消息的重复消费?(如关闭自动提交、使用全局唯一ID保证幂等性)◦ 如果遇到Kafka消息堆积,如何解决?4. AI应用与开发方法论◦ RAG(检索增强生成)的底层实现流程是怎样的?(文档分块、向量化、相似度检索)◦ 向量数据库的存储机制和算法是什么?(文档中提到对具体算法不够熟悉)◦ 是否了解ES(Elasticsearch)的倒排索引原理?◦ 如何缓解RAG中因相似度高但业务含义不同导致的“幻觉”问题?(如优化Prompt、调整检索块大小)◦ 是否了解知识图谱(Knowledge Graph)方案?◦ 是否了解Anti-RAG?◦ 请分享你使用AI(如CodeLlama)进行Web Coding的实践经验。◦ 是否了解SKILL(这里可能指特定框架或方法论,文档未详述)和领域驱动设计(DDD)?是否有相关实践经验?
查看30道真题和解析
点赞 评论 收藏
分享
牛客28967172...:跟着卡子哥才是正道,灵茶属实不太行
点赞 评论 收藏
分享
评论
1
4
分享

创作者周榜

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