面试题答案
一键面试Redis优化
集群部署方式选择
- 主从复制
- 方案:一个主节点负责写操作,多个从节点复制主节点数据,读操作可分摊到从节点。
- 技术挑战:主节点故障时,需要手动或通过 Sentinel 进行故障转移;数据同步存在延迟。
- 应对措施:采用 Sentinel 自动故障转移机制;合理设置复制延迟监控,在业务允许范围内接受一定延迟。
- Cluster 集群
- 方案:数据按哈希槽分布在多个节点,每个节点负责部分哈希槽,支持动态扩展和收缩。
- 技术挑战:客户端需要理解 Cluster 协议,进行节点重定向等操作;集群脑裂问题。
- 应对措施:使用成熟的客户端库,简化 Cluster 操作;设置合适的节点超时时间和最小存活节点数,避免脑裂影响业务。
MySQL优化
分库分表策略
- 垂直分库
- 方案:按业务模块将不同的表分到不同数据库,减少单库压力。
- 技术挑战:跨库事务处理复杂;查询涉及多库时性能问题。
- 应对措施:采用柔性事务解决方案,如 TCC、Saga 等;使用 ES 等搜索引擎辅助多库复杂查询。
- 水平分表
- 方案:根据某一字段(如用户ID、时间等)进行哈希或范围分区,将数据分散到多个表。
- 技术挑战:自增主键处理困难;数据迁移和扩容复杂。
- 应对措施:使用分布式 ID 生成器;采用平滑迁移方案,如双写 + 影子表方式。
- 水平分库
- 方案:将数据按某种规则(如按地区、按用户ID哈希等)分到不同数据库。
- 技术挑战:跨库关联查询复杂;数据一致性维护困难。
- 应对措施:尽量避免跨库关联,在应用层进行数据组装;使用消息队列进行数据同步,保证最终一致性。
数据同步机制优化
- 基于 Binlog 的同步
- 方案:MySQL 开启 Binlog,通过 Canal 等工具模拟 Slave 读取 Binlog,解析后同步到 Redis。
- 技术挑战:Binlog 格式解析复杂;同步延迟问题。
- 应对措施:使用成熟的 Binlog 解析工具;优化 Canal 配置,设置合理的队列大小和消费速度。
- 双写模式
- 方案:在业务代码中,对数据的写操作同时更新 MySQL 和 Redis。
- 技术挑战:数据一致性难以保证,可能出现先写 Redis 成功,写 MySQL 失败的情况。
- 应对措施:采用事务机制,将 MySQL 和 Redis 操作放在同一事务中(若 Redis 支持事务);或者使用消息队列进行重试补偿机制,保证数据最终一致性。