跳转至

数据库与分布式系统面试题

以对话形式回答,模拟真实面试场景

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 优化实战

索引优化

  1. B+树索引:了解 B+树的结构和查询过程
  2. 复合索引:最左前缀匹配原则
  3. 覆盖索引:避免回表查询
  4. 索引失效:了解哪些情况会导致索引失效

查询优化

  1. 执行计划:使用 EXPLAIN 分析查询
  2. 慢查询日志:定位性能瓶颈
  3. 分页优化:大偏移量分页的优化方案
  4. 子查询优化:转换为 JOIN 查询

事务与锁

  1. 事务隔离级别:理解四种隔离级别的区别
  2. MVCC:多版本并发控制的实现原理
  3. 死锁检测:InnoDB 的死锁检测算法
  4. 锁升级:行锁升级为表锁的场景

Redis 实战应用

缓存策略

  1. Cache-Aside:旁路缓存模式
  2. Write-Through:写透模式
  3. Write-Back:写回模式
  4. 缓存雪崩、击穿、穿透:常见问题及解决方案

数据结构应用

  1. String:计数器、分布式锁
  2. Hash:用户信息存储
  3. List:消息队列、时间线
  4. Set:标签系统、共同关注
  5. ZSet:排行榜、延时队列

高可用方案

  1. 主从复制:异步复制的一致性问题
  2. Sentinel:故障转移机制
  3. Cluster:分片算法和数据迁移
  4. 客户端分片:一致性哈希算法

分布式系统设计

CAP 理论

理解一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)的权衡。

分布式事务

  1. 2PC/3PC:两阶段提交和三阶段提交
  2. TCC:Try-Confirm-Cancel 模式
  3. Saga:长事务的处理方案
  4. 本地消息表:最终一致性实现

服务治理

  1. 服务发现:注册中心的作用
  2. 负载均衡:各种算法的适用场景
  3. 熔断降级:防止雪崩效应
  4. 限流:令牌桶、漏桶算法

数据一致性

  1. 强一致性:同步复制的代价
  2. 最终一致性:异步复制的实现
  3. 读写分离:主从延迟的处理
  4. 分布式锁:基于 Redis、ZooKeeper 的实现