我家云 Java开发 实习 一面

#JAVA##JAVA面经##JAVA内推#

先简单聊聊自己吧~学校专业、怎么接触编程的,还有为啥想做Java开发?

“我是XX大学计算机科学与技术专业大四学生。高中因信息学竞赛接触C++,大学用Java写第一个‘课程表查询系统’时被其严谨的面向对象设计和‘一次编写,到处运行’的特性吸引。选择Java开发,源于三点:一是企业级应用对稳定性的高要求(如金融、电商),二是Spring生态对工程化的极致追求(从Boot到Cloud),三是在校园项目中用Java解决真实问题的成就感——比如用线程池优化判题服务,让同学提交代码后秒级反馈。我享受用代码构建可靠系统的踏实感,也渴望在贵司这样的平台深耕后端技术。”

做过的项目里,哪个用SQL数据库最深入?

校园抽奖系统(Spring Boot + MySQL):

  • 表设计核心思路
    🔹 lottery_activity:活动基础信息(id, name, start_time, end_time, total_prizes)
    🔹 lottery_record:中奖记录(id, activity_id, user_id, prize_id, status, expire_time)
    关键设计
    user_id + activity_id 唯一索引(防重复中奖)
    status 字段(UNCLAIMED/CLAIMED/EXPIRED)支撑状态流转
    expire_time 索引(支撑半小时失效扫描)
    🔹 prize_pool:奖品池(id, activity_id, prize_name, stock)
  • 查询优化实例
    -- 查询用户未领取中奖记录(覆盖索引)
    SELECT id, prize_name, expire_time 
    FROM lottery_record r
    JOIN prize_pool p ON r.prize_id = p.id
    WHERE r.user_id = ? AND r.status = 'UNCLAIMED'
    ORDER BY r.create_time DESC;
    
    → 建联合索引(user_id, status, create_time),EXPLAIN显示Using index,耗时从120ms→8ms
  • 收获:数据库设计需‘业务驱动’——每个字段、索引都为解决具体问题而生。”

用户抽完奖马上关页面,中奖结果怎么保证不丢?

“三重保障机制:
1️⃣ 前端兜底:提交后立即存本地缓存(localStorage),页面关闭前发Beacon API保底上报
2️⃣ 后端可靠性

  • RabbitMQ Confirm模式 + 持久化队列
  • 消费者手动ACK(业务成功后才ack)
  • 失败消息入DLQ + 企业微信告警
    3️⃣ 数据校验
  • 定时任务扫描‘提交成功但无记录’的异常数据(对比MQ日志与DB)
  • 补偿脚本自动重发
    项目验证:压测10万次抽奖,数据丢失率=0。核心认知:用户无感知的可靠性,源于多层防御设计。”

抽奖后台用了异步吗?简单说说怎么设计的~

“是的,核心流程异步化:

flowchart LR
    A[用户点击抽奖] --> B{库存校验}
    B -- 通过 --> C[生成中奖记录<br>status=PROCESSING]
    C --> D[RabbitMQ发消息]
    D --> E[异步消费者]
    E --> F[扣减奖品库存]
    F --> G[更新记录status=UNCLAIMED]
    G --> H[WebSocket推送结果]
    B -- 失败 --> I[直接返回失败]

关键设计

  • 消息体含record_id,消费者幂等处理(查DB已存在则跳过)
  • 消费失败重试3次 → 入DLQ人工介入
  • 前端轮询/api/lottery/result?recordId=xxx兜底(防WebSocket断连)
    价值:接口响应P99从800ms→120ms,用户体验显著提升。”

会不会出现同一个人中奖记录被插多次?怎么防的?

“三重防护杜绝重复:
🔹 数据库层lottery_record表建唯一索引(user_id, activity_id),重复插入直接报DuplicateKeyException
🔹 应用层

  • 抽奖前查DB:SELECT COUNT(*) FROM lottery_record WHERE user_id=? AND activity_id=?
  • Redis分布式锁:SET lock:lottery:{userId}:{activityId} nx ex 10(防并发请求绕过DB查询)
    🔹 业务层
  • 前端按钮防重(点击后置灰3秒)
  • 接口层To

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏

全部评论

相关推荐

bg:北航cs本年前投了腾讯的提前批,基础微信部门约了面试,面试内容很基础,但由于鼠鼠没怎么准备还是一面挂了,年后又被企业微信部门捞了,这次强度直接拉满了,面的我汗流浃背上来先来三道题(限时半小时)-&nbsp;leetcode&nbsp;198.&nbsp;打家劫舍(还没刷到,不出意外的写错了,都没意识到是动态规划...)-&nbsp;leetcode&nbsp;199.&nbsp;二叉树的右视图(虽然刷过了,但由于不熟悉acm模式构造输出花了一些时间,写出来之后有问题,一直在调试,然后就到时间了...面试官让我说一下思路,并提问能不能用dfs做,引导了我去使用后序遍历,但鼠鼠还是没想出来)-&nbsp;类似&nbsp;1213.&nbsp;三个有序数组的交集(没做到这个题,面试官让说一下思路,我说了哈希表和多指针)此时鼠鼠心态已经崩了,我想着接下来该让我吟唱八股了吧,结果并没有,因为鼠鼠简历里写了一些学校的课设(编译器、操作系统、计组CPU),被狠狠拷打底层知识了-&nbsp;先问了一下实习干了什么,有什么难点(回答了性能优化,然后说了一些优化方案,还提了一下ssr)-&nbsp;用的webpack还是vite,知不知道webpack按需导入的原理(不知道)-&nbsp;vue和react中key的作用,为什么不能用index做key-&nbsp;问我的编译器怎么写的(回答用C++写的,涉及词法分析、语法分析、语义分析、生成中间代码等流程)-&nbsp;编译器中llvm&nbsp;ir是什么结构,是树还是扁平结构,llvm怎么转化为mips的(浅显的回答了一些)-&nbsp;问了操作系统的内存管理用的什么数据结构(回答链表,面试官又问是双向链表还是单向链表,我回答都类似双向链表,但和不普通的双向链表不太一样,具体忘了)-&nbsp;问了操作系统的进程阻塞怎么实现的(完全不记得了)-&nbsp;接着让讲一下js的事件循环(吟唱了一下八股)-&nbsp;又问了不了解闭包,闭包的变量存在栈中还是堆中,c++怎么实现闭包(八股里没说,已读乱回)-&nbsp;反问环节这些项目细节早就忘完了,之前也从来没人问过我这些,鼠鼠只是觉得简历比较空就把学校的这些计算机底层课设写到简历上了,面试官可能觉得我是个计算机高手,于是给我上了点强度事实证明不要在简历里写乱七八糟的东西,容易把握不住。
查看9道真题和解析
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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