即刻社招全栈开发一面面经
面试题目
- 做一下简单的自我介绍,包括学校、技术栈、开发语言和框架?
- 介绍一下你实习期间负责的主要业务模块?
- 你在实习中主要负责哪些功能开发?
- 你擅长线上 Bug 排查,具体排查过哪些问题?
- 你做过哪些慢查询接口优化?
- 你使用过哪些大数据组件?
- 你之前做的 ETL 数据清洗流程是怎样的?
- 为什么选用 Redis 实现抽奖相关功能?
- 你使用过哪些 Redis 数据结构,为什么这样选?
- 为什么要为不同倍数维护独立奖池?
- 如何通过随机数和权重实现抽奖路由?
- 为什么用 lpop 拉取令牌来实现抽奖?
- 为什么要把抽奖逻辑写在 Lua 脚本里?
- Lua 脚本如何保证原子性和并发安全?
- 细粒度奖池如何保证概率稳定、防止超发?
- 线上出现异常时如何通过插入无效令牌做风控?
- 为什么中低价值礼物和高价值礼物要做推送分流?
- 中低价值礼物横幅推送,Redis 批处理为什么用 pipeline 而不用 Lua?
- pipeline 如何减少 IO、提升性能?
- 礼物连击的 Redis Key 是如何设计的?
- 为什么用前缀分类 Key,如何缩小扫描范围?
- 定时任务扫描频率和数据量大概是多少?
- Redis 出现 BigKey 导致 CPU 100% 怎么处理?
- 线上 Redis 打满如何第一时间恢复业务?
- 如何快速定位 BigKey 来源?
- 单个接口异常如何做限流保护?
- 你用过 Prometheus + Grafana 监控哪些内容?
- 链路追踪中 traceId 如何生成和传递?如果让你设计一个链路追踪器,你会考虑哪些问题?
- 你在 K8s 中如何查看日志排查问题?
- 你对 Docker、K8s 了解到什么程度?
- 你在项目中如何设计熔断降级策略?
- 熔断兜底为什么选择返回“未中奖”?
- 大量请求打垮下游服务时如何防止级联故障?
- 如果让你实现一个简单熔断器,你会怎么设计?
- 你主要使用 Java 还是 Go,业务比例大概多少?
- 对 Node.js、TS 全栈开发有什么看法?
- Redis MQ 和 Kafka 的区别与适用场景?
- MySQL 索引设计主要考虑哪些因素?
- 为什么离开上一家公司,为什么换工作?
- 你更倾向做什么类型的业务,对工作地点有要求吗?
参考解析
- Redis 抽奖逻辑(Lua/原子性):Lua 脚本在执行过程中会阻塞其他命令,保证了操作的原子性,避免了在高并发下“先判断库存、再扣减”造成的超发问题。
- BigKey 处理:优先定位(redis-cli —bigkeys 或 scan),处理上通常采用分拆(将一个 BigHash 拆为多个小 Key)、异步清理(unlink)以避免阻塞主线程导致 CPU 100%。
- 熔断降级:通过滑动窗口统计接口失败率或延迟,超过阈值则断开连接。返回“未中奖”属于兜底策略,能有效防止级联故障,保护下游服务,牺牲部分体验换取系统可用性。
- 链路追踪(TraceId):基于 ThreadLocal(Java)或 Context(Go)在当前线程/协程内传递;设计时需考虑埋点性能损耗、跨进程/跨语言的协议兼容性以及采样率控制。
- Redis Pipeline vs Lua:Pipeline 适用于批量读写请求(减少网络 IO RTT),Lua 适用于需要服务端逻辑判断的复杂原子操作(减少多次往返请求且保证原子性)。