大北农集团 Java 一面面经
《面试题目》
Redis 专题
- Redis 去重方案,是使用“用户 ID + 消息模板 ID”作为键吗?这里的模板 ID是指每个配置的模板类型拥有唯一 ID,还是说不同配置下 ID 会重复?
- 项目中使用的 Redis 架构模式是什么?是单节点、哨兵模式(Sentinel)还是集群模式(Cluster)?
- 引入 Apollo 配置中心是为了解决什么问题?
消息队列与并发 4. Kafka 部署时如何搭建生产环境和消费环境?具体的集群架构或部署方式是? 5. 关于渠道业务,后续流量增大,如何设计限流策略? 6. 项目中的线程池具体用哪种方式创建或配置? 7. 详细描述项目中使用线程池的整体逻辑流程,包括任务提交、执行以及后续处理的步骤。 8. 线程池的拒绝策略主要有哪几种? 9. 核心线程数(corePoolSize)在运行过程中是否可以动态减少? 10. 数据清洗过程中是否考虑过可能出现消息乱序或数据重复的问题?如果有,如何解决?
MySQL 数据库 11. 使用的 MySQL 数据库中,单表的最大数据量大概达到多少? 12. 在数据库中添加索引的主要目的是什么? 13. 添加索引时,特定的规范或原则?具体的优化策略? 14. 简要解释回表。 15. 对于一条包含 SELECT * FROM table WHERE condition ORDER BY … LIMIT … 的 SQL 语句,各个子句的执行顺序? 16. 如果是多表关联查询(涉及主表和子表),MySQL 底层是如何处理和执行这些连接操作的?
系统设计与业务思考 17. 假设开发的一个接口响应时间长达一分钟,需要从哪些方面入手进行优化? 18. 结合您的开发经历,你认为引入大模型技术相比传统开发方式,主要在哪些方面提升了开发效率或系统能力? 19. 多场景对话支持中,系统如何实现不同场景之间的隔离与共享? 20. 主要使用了什么存储介质来保存对话的状态、记忆或中间数据?
《参考解析》
- Redis去重:通常使用
SETNX或布隆过滤器。模板ID需保证业务全局唯一,避免不同配置冲突。建议使用业务前缀:模板ID:用户ID作为 Key。 - 线程池动态调整:核心线程数可以通过
setCorePoolSize动态修改。拒绝策略包括AbortPolicy(丢弃抛异常)、CallerRunsPolicy(调用者线程执行)、DiscardPolicy(丢弃)、DiscardOldestPolicy(丢弃最旧)。 - SQL执行顺序:
FROM->JOIN->WHERE->GROUP BY->HAVING->SELECT->ORDER BY->LIMIT。 - 回表:当查询索引树(非聚簇索引)中不包含所有需要的字段时,需要通过索引中的主键ID去聚簇索引树中再次查询,即为回表。
- 接口响应慢优化:检查数据库索引、SQL执行计划;排查网络延迟、慢接口阻塞;使用 Redis 缓存热点数据;引入异步处理(MQ);对复杂业务进行分表或削峰填谷。