面试题答案
一键面试策略一:读写穿透
- 实现方式:
- 读操作:应用程序首先从缓存读取数据,如果缓存未命中,则从数据库读取数据,然后将数据写入缓存。
- 写操作:应用程序同时更新数据库和缓存,确保两者数据一致。
- 优点:
- 数据一致性较好,因为每次读写操作都直接与数据库交互,缓存中的数据能及时反映数据库的状态。
- 实现相对简单,应用层逻辑清晰,容易理解和维护。
- 缺点:
- 性能问题,每次读写都涉及数据库操作,在高并发场景下,数据库可能成为性能瓶颈。
- 缓存更新频率高,写操作时可能会因为缓存更新失败但数据库更新成功,导致短暂的数据不一致。
策略二:失效模式(Cache - Aside Pattern)
- 实现方式:
- 读操作:应用程序先从缓存读取数据,若缓存命中则直接返回;若未命中,则从数据库读取并写入缓存。
- 写操作:应用程序先更新数据库,然后使缓存失效(删除缓存中的数据)。当下次读取时,缓存未命中,会重新从数据库加载最新数据到缓存。
- 优点:
- 性能较好,读操作大部分情况可直接从缓存获取数据,减少对数据库的压力。
- 相对读写穿透,减少了缓存更新的频率,降低了缓存更新失败导致数据不一致的风险。
- 缺点:
- 存在数据不一致窗口期,写操作后到下次读取前,缓存中的数据是旧的。在高并发读写场景下,可能会出现数据不一致的时间稍长。
- 应用层需要额外处理缓存失效逻辑,增加了代码复杂度。
策略三:双写模式
- 实现方式:
- 读操作:同读写穿透,先从缓存读,未命中则从数据库读并写入缓存。
- 写操作:应用程序先更新缓存,再更新数据库。为保证一致性,还需要有重试机制,若数据库更新失败,需回滚缓存更新操作。
- 优点:
- 读性能较好,因为缓存更新相对较快,后续读操作能快速从缓存获取数据。
- 相比失效模式,减少了数据不一致的窗口期,因为缓存先更新,读操作能更快获取到新数据。
- 缺点:
- 实现复杂,需要处理缓存和数据库更新的先后顺序以及失败重试和回滚逻辑。
- 可能出现缓存更新成功但数据库更新失败的情况,即使有回滚机制,实现不当也可能导致数据不一致。