难度分级:
问题结构:
答案结构:
回答要点参考:
回答要点参考:
回答要点参考:
回答要点参考:
使用STAR法则(情境、任务、行动、结果)来描述:
回答要点参考:
代码评审的三个重要关注点:
回答要点参考:
回答要点参考:
参考:问题排查
回答要点参考:
性能优化的系统性方法:
1. 集群化部署
以Redis为例:
2. 流量控制
监控应用流量的QPS或并发线程数,当达到指定阈值时对流量进行控制,避免被瞬时流量高峰冲垮。
推荐框架:Alibaba Sentinel
3. 超时和重试机制
4. 熔断机制
5. 异步调用
6. 缓存策略
7. 代码质量保障
8. 运维保障措施
回答要点参考:
技术设计文档应包含以下关键部分:
回答要点参考:
面对模糊或冲突需求的处理流程:
回答要点参考:
引入异步处理的三个主要技术风险:
回答要点参考:
微服务拆分的维度和原则:
拆分维度:
拆分原则:
微服务基础设施支撑:
问题:若现有系统的数据库出现性能瓶颈(如单表亿级数据),请列出三种不同的优化路径(如分库分表、读写分离、引入OLAP引擎),并分析每种方案的适用场景和实施成本
回答要点参考:
三种主要优化路径:
1. SQL和索引优化
SELECT *
,减少子查询,优化WHERE条件顺序2. 架构层面优化
3. 存储引擎优化
详细优化方法:
优化查询语句
SELECT *
WHERE
子句中的条件顺序,将选择性强的条件放前面WHERE
子句中使用函数,防止索引失效优化数据表结构
创建合适的索引
数据库参数调优
使用合适的查询方式
回答要点参考:
单体架构迁移到分布式架构的主要技术挑战:
数据一致性挑战
服务拆分挑战
运维复杂性增加
团队协作挑战
问题:什么是事务?它有哪些特性(ACID)?请解释SQL标准中的四种事务隔离级别(读未提交、读已提交、可重复读、串行化),并说明它们分别解决了哪些并发问题(脏读、不可重复读、幻读)。
回答要点参考:
事务(Transaction) 是数据库操作的逻辑单位,它由一系列数据库操作组成,这些操作要么全部成功,要么全部失败。事务具有以下四个基本特性,通常被称为ACID属性:
事务隔离级别:
Spring事务隔离
在并发环境下,Spring 通过声明式事务(@Transactional
)为业务代码提供事务管理能力。Spring 定义了与 SQL 标准一致的 4 种隔离级别,并额外保留 DEFAULT 以沿用底层数据库的默认设置:
Spring 常量 | 隔离级别 | 解决的并发问题 |
---|---|---|
ISOLATION_READ_UNCOMMITTED |
读未提交 | 可能出现脏读、不可重复读、幻读 |
ISOLATION_READ_COMMITTED |
读已提交 | 避免脏读,但仍可能出现不可重复读、幻读 |
ISOLATION_REPEATABLE_READ |
可重复读 | 避免脏读、不可重复读,但仍可能出现幻读 |
ISOLATION_SERIALIZABLE |
串行化 | 避免所有并发问题,性能最差 |
ISOLATION_DEFAULT |
数据库默认 | 取决于具体数据库(MySQL InnoDB 默认可重复读) |
使用建议:
问题:如何使用EXPLAIN
关键字来分析MySQL查询?请解释执行计划中最重要的几个字段(如type
、key
、rows
、Extra
)的含义。
回答要点参考:
EXPLAIN
用于分析查询语句的执行计划,关键指标如下:
system
> const
> eq_ref
> ref
> range
> index
> ALL
。应力求达到 range
级别,最好是 ref
。ALL
表示全表扫描,通常需要优化。Using filesort
(需要优化)、Using temporary
(需要优化)、Using index
(性能好,覆盖索引)。问题:B树和B+树作为索引结构,它们的核心区别是什么?为什么MySQL的InnoDB引擎选择B+树作为其索引实现?
回答要点参考:
核心区别:
为什么InnoDB选择B+树:
id > 100
)只需定位到起点,然后沿链表遍历即可,无需回溯树,IO效率极高。回答要点参考:
MySQL InnoDB 使用 B+ 树索引。假设单页 16 KB、主键 8 字节、指针 6 字节,一个三层 B+ 树理论上即可支撑 约 2 千万行 数据仍保持 3 次磁盘 IO 内定位。
当单表数据达到千万级甚至上亿时,通常需要结合 分区表、分库分表、冷热数据归档 等手段继续扩容。更多推导过程可参考:https://blog.csdn.net/z1ztai/article/details/129796333
问题:当Redis内存不足时,有哪些内存淘汰策略(如volatile-lru
, allkeys-lru
, noeviction
等)?它们各自适用于什么业务场景?
回答要点参考:
Redis提供了多种内存淘汰策略,通过 maxmemory-policy
配置:
问题:基于Redis实现分布式锁时,需要注意哪些关键点才能保证其可靠性(如原子性操作、锁超时、锁竞争等)?请描述一种推荐的实现方案(如SETNX
+ Lua脚本 或 Redlock算法)。
回答要点参考:
关键点:
SETNX
)和设置过期时间必须是原子操作,否则进程在加锁后、设置过期时间前崩溃,会导致死锁。推荐实现:
使用 SET key value NX PX milliseconds
命令。这个命令将 SETNX
和 EXPIRE
合并为一个原子操作,是实现分布式锁的首选。
NX
: 表示只在key不存在时才设置。PX
: 表示过期时间的单位是毫秒。解锁时,使用Lua脚本来保证"获取锁的值、判断、删除"这三个操作的原子性。
回答要点参考:
分布式环境下生成唯一标识符的常见方法:
主要关键在于是否需要严格递增,严格递增的话效率必然大降。
目前没有很好的分布式方案,大概只能单机生成,效率约为每秒十几到二十几万的速度。
问题:你们是怎么分库分表的?分布式ID如何生成?
回答要点参考:
分库分表策略需要考虑:
回答要点参考:
当Kafka出现百万消息堆积时,解决方案如下:
首先排查是否有bug,如果是,要快速修复。常见问题:
如果不是bug,可能是消费者速度不给力,可以:
假设优化前1秒处理100条消息,优化后1秒可以处理500条消息。
两台机器一小时可以处理:2 × 500 × 3600 = 3,600,000 条消息
业务紧急时,可以临时紧急扩容,新建临时topic:
回答要点参考:
与5年前相比的成长:
回答要点参考:
指导初级工程师成长的方法:
回答要点参考:
促进团队技术知识分享和协作的方法:
回答要点参考:
任务分配和工作负载管理的流程:
回答要点参考:
面对空降5个人的处理方式:
回答要点参考:
紧急情况下的技术决策经历(使用STAR法则):
回答要点参考:
处理技术方案分歧的经历:
回答要点参考:
紧迫截止日期下的项目管理经历:
回答要点参考:
平衡项目管理和技术能力的方法:
回答要点参考:
描述团队组成和分工:
回答要点参考:
公共组件开发经验:
回答要点参考:
获取和分析用户需求的方法:
回答要点参考:
与非技术团队沟通的技巧:
回答要点参考:
产品规划的思路和模板:
回答要点参考:
激励和发展技术团队的方法:
回答要点参考:
机器学习项目的完整流程:
回答要点参考:
数据中台建设的关键要素:
回答要点参考:
前端获取后端实时数据的几种方式:
轮询(Polling)
长轮询(Long Polling)
WebSocket
Server-Sent Events (SSE)
参考:十分钟掌握前端获取实时数据的三种主流方式
情境(Situation)
任务(Task)
行动(Action)
结果(Result)