数据库与分布式系统面试题¶
以对话形式回答,模拟真实面试场景
18. 数据库用的什么?数据库锁有了解吗?mysql锁机制讲一下。mysql分库分表。¶
面试官:你们项目用什么数据库?MySQL 的锁机制了解吗?
回答:我们主要用 MySQL,InnoDB 存储引擎。
MySQL 的锁机制按粒度分有表级锁、行级锁和页级锁。InnoDB 主要是行级锁,粒度更细,并发性能更好。
按类型分有共享锁和排他锁。共享锁就是读锁,多个事务可以同时持有;排他锁是写锁,独占访问。
InnoDB 还有一些特殊的锁,比如记录锁锁定具体的行,间隙锁用来防止幻读,Next-Key Lock 是记录锁加间隙锁的组合。
面试官:死锁怎么处理?
回答:InnoDB 有自动死锁检测机制,发现死锁后会选择代价最小的事务进行回滚。我们在业务代码中也会捕获死锁异常,然后重试。
面试官:分库分表做过吗?
回答:做过。我们根据业务需求采用了垂直分库和水平分表的组合策略。
垂直分库是按业务模块来分,比如用户库、订单库、商品库这样分开,减少单库的压力。
水平分表是按用户ID哈希来分表,比如用户ID模100,分成100个用户表,这样可以分散数据量和访问压力。
我们使用了 sharding 中间件来处理路由逻辑,应用层基本感知不到分表的存在。
19. 讲一下redis分布式锁?redis主从模式和集群模式的区别了解过吗?redis的数据类型有哪些?redis持久化怎么做的?¶
面试官:Redis 分布式锁你了解吗?怎么实现的?
回答:了解的,Redis 分布式锁是我们项目中经常用到的。
基本实现是用 SET 命令配合 NX 和 EX 参数,NX 表示只有 key 不存在时才设置,EX 设置过期时间。获取锁就是设置成功,释放锁要用 Lua 脚本来保证原子性,先检查 value 是否匹配再删除。
对于高可用场景,还有 Redlock 算法,在多个 Redis 实例上同时获取锁,只有超过半数成功才算获取到锁。
面试官:Redis 的主从模式和集群模式有什么区别?
回答:主要区别在几个方面:
数据分布上,主从模式是全量复制,所有数据都在每个节点上;集群模式是分片存储,数据分散在不同节点。
扩展性方面,主从模式主要是垂直扩展,通过增加从节点来提高读性能;集群模式是水平扩展,可以通过增加节点来扩展容量和性能。
高可用机制也不同,主从模式需要 Sentinel 来做故障转移;集群模式内置了故障转移机制。
面试官:Redis 有哪些数据类型?
回答:基础的五种类型:String、Hash、List、Set、ZSet。
还有一些高级类型,比如 HyperLogLog 用于基数统计,Bitmap 用于位图操作,GEO 用于地理位置计算,Stream 用于消息流处理。
面试官:持久化怎么做的?
回答:Redis 有两种持久化方式:
RDB 是快照方式,定期将内存中的数据集快照写入磁盘,恢复时直接加载快照文件。
AOF 是追加文件方式,记录每个写操作,恢复时重新执行这些操作。
Redis 4.0 之后还支持混合持久化,AOF 文件以 RDB 格式开头,后面追加增量的 AOF 日志,这样既有 RDB 的快速恢复,又有 AOF 的数据完整性。
MySQL 优化实战¶
索引优化¶
- B+树索引:了解 B+树的结构和查询过程
- 复合索引:最左前缀匹配原则
- 覆盖索引:避免回表查询
- 索引失效:了解哪些情况会导致索引失效
查询优化¶
- 执行计划:使用 EXPLAIN 分析查询
- 慢查询日志:定位性能瓶颈
- 分页优化:大偏移量分页的优化方案
- 子查询优化:转换为 JOIN 查询
事务与锁¶
- 事务隔离级别:理解四种隔离级别的区别
- MVCC:多版本并发控制的实现原理
- 死锁检测:InnoDB 的死锁检测算法
- 锁升级:行锁升级为表锁的场景
Redis 实战应用¶
缓存策略¶
- Cache-Aside:旁路缓存模式
- Write-Through:写透模式
- Write-Back:写回模式
- 缓存雪崩、击穿、穿透:常见问题及解决方案
数据结构应用¶
- String:计数器、分布式锁
- Hash:用户信息存储
- List:消息队列、时间线
- Set:标签系统、共同关注
- ZSet:排行榜、延时队列
高可用方案¶
- 主从复制:异步复制的一致性问题
- Sentinel:故障转移机制
- Cluster:分片算法和数据迁移
- 客户端分片:一致性哈希算法
分布式系统设计¶
CAP 理论¶
理解一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)的权衡。
分布式事务¶
- 2PC/3PC:两阶段提交和三阶段提交
- TCC:Try-Confirm-Cancel 模式
- Saga:长事务的处理方案
- 本地消息表:最终一致性实现
服务治理¶
- 服务发现:注册中心的作用
- 负载均衡:各种算法的适用场景
- 熔断降级:防止雪崩效应
- 限流:令牌桶、漏桶算法
数据一致性¶
- 强一致性:同步复制的代价
- 最终一致性:异步复制的实现
- 读写分离:主从延迟的处理
- 分布式锁:基于 Redis、ZooKeeper 的实现