面试题答案
一键面试1. 双写模式
- 策略:在业务代码中,先写入MySQL,成功后再写入Redis。
- 优点:实现简单,业务代码层面容易理解和维护。
- 缺点:在高并发场景下,如果先写MySQL成功,写Redis失败,会导致数据不一致;同时,双写操作会增加系统响应时间。
2. 先写缓存后写数据库(不推荐)
- 策略:先写入Redis,成功后再写入MySQL。
- 优点:理论上响应速度更快,因为Redis是内存数据库,写入速度极快。
- 缺点:高并发时,写MySQL失败而写Redis成功,后续查询可能读到脏数据;并且如果缓存过期,再次查询时会先查MySQL再更新Redis,在这期间可能存在不一致。
3. 异步队列同步
- 策略:将MySQL写入操作封装成消息,发送到消息队列(如Kafka、RabbitMQ)。消费者从队列中取出消息,先更新MySQL,成功后再更新Redis。
- 优点:解耦了写入MySQL和更新Redis的操作,提高系统的稳定性和扩展性;可以通过消息重试机制解决写入失败问题,保证数据一致性。
- 缺点:引入消息队列增加了系统复杂度;存在消息积压、丢失等风险,需要额外处理。
4. 基于数据库binlog同步
- 策略:MySQL开启binlog日志,通过专门的工具(如Canal)监听binlog变化。当有数据写入MySQL时,Canal获取binlog信息,解析后同步到Redis。
- 优点:对业务代码侵入性小;能够保证数据的最终一致性,因为binlog记录了数据库所有的更改操作。
- 缺点:部署和维护Canal等工具增加了系统复杂度;同步存在一定延迟,不适用于对实时性要求极高的场景。
5. 分布式事务(二阶段提交、三阶段提交等)
- 策略:采用分布式事务框架(如Seata),将MySQL写入和Redis更新纳入同一个事务。
- 优点:严格保证数据一致性,在分布式场景下能够协调多个资源的操作。
- 缺点:性能开销大,因为事务协调过程涉及多次网络交互;实现复杂,对系统资源要求高;如果协调者出现故障,可能导致事务无法完成。