面试题答案
一键面试1. 双写模式
- 策略:在应用层,对数据进行更新操作时,同时向MySQL和Redis写入数据。
- 优点:
- 实现简单,在业务代码层面较容易实现。
- 能快速响应读写请求,因为应用程序直接操作两个存储系统。
- 缺点:
- 一致性问题较难保证。如果写MySQL成功但写Redis失败,可能导致数据不一致。
- 性能问题,每次更新都要操作两个存储,增加了系统开销。
2. 先更新MySQL,再删除Redis缓存
- 策略:当数据发生变化时,首先更新MySQL,然后删除对应的Redis缓存数据。当下次读取时,发现Redis中没有数据,就从MySQL读取并重新写入Redis。
- 优点:
- 相对双写模式,一致性较易保证。因为最终数据以MySQL为准,删除缓存后能保证下次读取的数据是最新的。
- 性能上比双写稍好,写操作只针对MySQL,读操作才涉及Redis。
- 缺点:
- 存在短暂的不一致窗口。在更新MySQL和删除Redis缓存之间,可能有读请求读取到旧数据。
- 删除缓存失败时,也会导致数据不一致。如果删除缓存操作失败,可能导致旧数据一直存在于Redis中。
3. 基于Binlog的异步同步
- 策略:MySQL开启Binlog日志功能,通过一个中间组件(如Canal)监听Binlog日志的变化,当有数据更新时,解析Binlog获取更新信息,然后异步更新Redis。
- 优点:
- 对业务代码侵入性小,业务逻辑与数据同步逻辑分离。
- 数据一致性较高,因为是基于MySQL的Binlog进行同步,能保证与MySQL数据的一致性。
- 异步操作,不影响业务系统的正常读写性能。
- 缺点:
- 架构相对复杂,需要引入额外的组件(如Canal),增加了系统维护成本。
- 同步存在一定延迟,因为是异步操作,从MySQL数据更新到Redis数据同步完成之间会有延迟。