1. MySQL 事务机制(阿里巴巴)
事务确保一组数据库操作要么全部成功执行,要么全部失败回滚。
核心特性:
- 原子性:把多个操作打包成一个整体,要么全做,要么全不做。
- 一致性:事务执行前后,数据库从一个一致状态转换到另一个一致状态,数据完整性约束不被破坏。
- 隔离性:多个事务并发执行时,彼此的操作互不干扰,每个事务都感觉不到其他事务的存在。
- 持久性:事务一旦提交,其修改会永久保存到数据库中,即使系统崩溃也不会丢失。
2. SQL 优化实践(阿里巴巴)
1. 优化联表查询,使用 JOIN
-- 优化前
SELECT name FROM users WHERE id IN (SELECT user_id FROM orders WHERE status = 1);
-- 优化后
SELECT u.name FROM users u JOIN orders o ON u.id = o.user_id WHERE o.status = 1;
*2. 避免使用 SELECT ,只查询需要的字段
-- 优化前
SELECT * FROM users WHERE age > 30;
-- 优化后
SELECT id, name, email FROM users WHERE age > 30;
3. 为 WHERE、JOIN、ORDER BY 字段建立索引
-- 为查询条件字段建索引
CREATE INDEX idx_user_age ON users(age);
-- 为 JOIN 关联字段建索引
CREATE INDEX idx_orders_user_id ON orders(user_id);
-- 为排序字段建索引
CREATE INDEX idx_articles_create_time ON articles(create_time);
3. Nacos 底层注册中心实现(阿里巴巴)
Nacos 的核心围绕服务注册、服务发现、健康检查三大功能展开。
服务注册机制 服务提供者启动时,通过客户端向 Server 发送注册请求,携带服务名、IP、端口等元数据。Server 将信息存储在内存注册表中。
服务发现机制 消费者启动时主动拉取实例列表并缓存本地。变更时,Server 主动推送通知给消费者,减少轮询开销。
健康检查机制 Server 定期向实例发送健康检查请求,若连续失败则标记为不健康;或者实例定期发送心跳包。
4. RocketMQ 如何持久化(阿里巴巴)
RocketMQ 依靠交换器持久化、队列持久化和消息持久化来实现数据的可靠存储。
5. WebSocket 介绍(阿里巴巴)
WebSocket 是一种协议,用于在客户端和服务器之间建立持久的双向通信连接,适用于需要实时数据交换的场景。
核心特点:
- 持久连接:建立后保持长期通信状态,无需频繁创建关闭。
- 双向通信:服务器可主动向客户端推送数据,打破 HTTP 限制。
- 低开销:传输时无需携带大量 HTTP 头部信息。
6. HTTP 长连接与短连接判断(阿里巴巴)
区别在于一次 TCP 连接是否可以被多次 HTTP 请求复用。
- HTTP/1.0:默认短连接。
- HTTP/1.1:默认长连接。
可通过响应头 Connection 字段判断,若无则按默认处理。设置长连接即修改该响应头。
7. HashMap 实现原理(快手)
HashMap 底层是数组 + 链表 + 红黑树的组合。
- Hash 计算:对键的 hashcode 进行高低位异或,混合信息以减少冲突。桶索引通过
哈希值 & (数组长度 - 1)计算,要求长度为 2 的幂次方。 - 插入逻辑:桶为空直接插入;非空且为树则按树规则插入;为链表则遍历尾部插入。若链表长度≥8,转为红黑树。
- 扩容机制:元素总数超过阈值(capacity * loadFactor,默认 0.75)时,数组长度翻倍并重新计算索引。
- JDK 版本差异:JDK 1.8 优化了扩容重哈希开销,并将头插法改为尾插法,避免多线程扩容死循环。

8. HashMap 树化与退化阈值(快手)
当红黑树节点数≤6 时,退化为链表。阈值设置不对称(8→树,6→链)是为了防抖动,避免节点数在阈值附近波动导致频繁转换,减少性能开销。
9. MySQL 和 Redis 一致性保证(快手)
最终一致方案 读取时先查 Redis,无则查 MySQL 并写入 Redis。更新时先更新 MySQL,再删除 Redis 缓存。删除而非更新缓存可避免原子性问题,后续读取自动加载新数据。
强一致方案 获取分布式锁,开启 MySQL 事务更新数据,提交后立即更新或删除 Redis 缓存,最后释放锁。这避免了并发覆盖问题。
10. 数据库隔离级别(快手)
- 读未提交:一致性最低,允许脏读。
- 读已提交:避免脏读。
- 可重复读:同一事务内多次读取结果一致,避免不可重复读。
- 串行化:完全串行执行,避免所有并发问题。
默认级别:MySQL 默认可重复读,SQL Server 默认为读已提交。
11. 缓存击穿、穿透、雪崩解决(快手)
- 缓存穿透:请求不存在 Key 持续打到 DB。解决方案:布隆过滤器预判 Key 存在性,或对 DB 也不存在的 Key 存储空值。
- 缓存雪崩:大量 Key 同时过期或 Redis 宕机。解决方案:设置随机过期时间,避免集中失效。
- 缓存击穿:热点 Key 失效瞬间流量打穿 DB。解决方案:热点 Key 永不过期或加互斥锁。
12. Redis 扛不住库存请求处理(快手)
- 集群部署:分片存储分散压力,读写分离提升吞吐。
- 限流:前端、网关或 MQ 进行流量控制。
- 熔断降级:监控响应时间,超时则返回旧缓存或将写请求暂存队列异步同步。
13. sleep 和 wait 区别(阿里巴巴)
- 前提:sleep 无需持有锁,wait 必须拥有对象锁。
- 锁影响:sleep 不释放锁,wait 主动释放锁。
- 唤醒:sleep 时间到或中断唤醒;wait 需 notify 或超时/中断唤醒。
- 用途:sleep 阻塞线程,wait 等待其他线程唤醒。
14. RabbitMQ 消息不丢失保证(快手)
从生产者到消费者全流程保障:
- 发送端:开启 Confirm 模式确认消息到达 Exchange,Return 模式确认到达 Queue。
- 中间件:配置持久化(队列、Exchange、消息),故障重启不丢。
- 消费端:关闭自动确认,手动 ACK,配置重试次数与死信队列。
死信队列应用:用于消息重试、丢弃无法处理的消息或日志收集。
15. 算法题:合并 K 个升序链表(快手)
暴力两两合并复杂度较高。推荐使用优先级队列(小根堆)优化,每次取出最小节点,将其下一个节点入堆。


16. Redis Replication 原理(快手二面)
主从复制实现数据冗余和读分流。
- 保存主节点信息:从节点记录 Master IP 和端口。
- 建立连接:验证网络连通性。
- 同步数据集:首次全量同步,后续部分同步。
- 命令持续复制:Master 持续发送写命令,Slave 执行以保证一致性。
17. Redis 数据结构及应用场景(快手)
- String:缓存热点数据、分布式锁、计数器。
- Hash:存储对象数据、购物车。
- List:消息队列。
- Set:去重、共同好友、推荐算法。
- ZSet:排行榜、延迟任务。
18. SQL 加了索引仍慢的原因(快手)
核心是索引未被有效使用或设计不合理。
- 索引失效:索引列参与函数运算、使用不等于或 NOT IN 等。
- 设计缺陷:选择性差(重复值多)、大字段索引效率低。
19. RabbitMQ 消息顺序保证(快手二面)
全局顺序难保障,通常关注局部顺序。
- 基础方案:单队列单消费者,原生 FIFO 特性。
- 优化方案:分区消费。按 ID 分组路由到不同队列,每个队列配专属消费者,本质仍是单队列单消费。
20. Linux 查看日志命令(快手二面)
grep [选项] "字符串" 文件名
常用选项:-i忽略大小写,-n显示行号,-v反向匹配。
实时跟踪:
tail -f app.log | grep "ERROR"
docker logs -f myapp
docker logs -n 100 myapp
21. Linux 查找端口占用命令(快手二面)
netstat -tuln | grep 端口号
# 例如
netstat -tuln | grep 3306
22. Java 异常子类(快手)
- Checked Exception:IOException, SQLException, ClassNotFoundException(编译期强制处理)。
- RuntimeException:NullPointerException, IndexOutOfBoundsException, ArithmeticException(运行时抛出)。
23. 数据库操作相关异常(快手)
包括 SQL 语法错误、连接失败、违反约束、数据类型不匹配或越界等。
24. Redis 的 DECR 操作(快手)
DECR 命令对指定键数值原子性减 1。键不存在则初始化为 0 再减 1。常用于计数器递减或库存扣减,具备原子性和高性能。
25. HTTPS 底层工作原理(字节跳动)
HTTPS 是在 HTTP 基础上引入加密层。
前置知识:对称加密(同密钥)与非对称加密(公钥/私钥)。
流程:
- 客户端请求:发起 HTTPS 连接。
- 服务器响应:发送数字证书(含公钥及 CA 签名)。
- 客户端验证:验证证书完整性、有效期、颁发机构及吊销状态。
- 生成会话密钥:客户端生成随机对称密钥,用服务器公钥加密后发送。
- 解密会话密钥:服务器用私钥解密。双方持相同密钥进行后续通信加密。


