好未来后端开发二面面经(已OC)
面试题目
- 自我介绍(项目、技术栈、实习经历)
- 手撕算法:三数之和最接近目标值
- 数据库:MySQL 索引为什么用 B+ 树,其优势是什么?
- SQL编写:查询订单总价<10 元且存在单价>10 元商品的订单
- Redis应用:礼物连击/飘屏业务中的使用场景
- Redis原理:自增+过期时间为何需用 Lua 脚本保证原子性
- Redis基础:数据结构、Key 设计规范
- 高并发架构:礼物连击方案优化、批处理、管道、限流熔断
- Redis集群/主从架构了解
- 网络:TCP 四次挥手的原因
- 网络:TIME_WAIT 过多的解决办法
- 线上排查:Bug 排查案例(版本管理、ID 不一致、网关权限)
- 线上排查:Java 服务内存 100% 快速止损与定位思路
- 线上排查:内存飙高常见原因清单
- 线上排查:紧急恢复思路
- 综合考察:离职原因、offer 情况、职业规划、技术栈偏好
参考解析
- MySQL B+树优势:相比B树,B+树的非叶子节点只存储索引,能容纳更多索引项,使得树更矮胖,磁盘IO次数少;所有叶子节点通过双向链表连接,利于范围查找。
- Redis Lua脚本原子性:Redis在执行Lua脚本时会阻塞其他指令,从而确保脚本内的操作(如INCR后设置EXPIRE)作为一个整体执行,避免中途出现网络中断导致数据不一致。
- TCP TIME_WAIT:为保证连接关闭时的可靠性(确认对端收到FIN ACK)和处理滞留的网络数据包。解决办法:优化连接池、开启TCP重用(tcp_tw_reuse)或减小系统时间限制。
- 内存飙高止损:先dump内存快照(jmap),重启服务或切换流量实现快速止损。排查思路包括:查看GC日志、分析对象引用链、检查是否有大对象创建或内存泄漏。