MST

星途 面试题库

面试题:缓存设计之高级难度:缓存更新策略及一致性权衡

在高并发场景下,阐述写后失效、写前失效和写时更新这三种缓存更新策略的优缺点,并说明如何根据业务场景权衡选择以保证缓存一致性。
11.6万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

写后失效

  • 优点
    • 实现简单,在数据更新后直接让缓存失效,开发成本低。
    • 对业务代码侵入性小,不影响正常的写操作流程。
  • 缺点
    • 存在缓存不一致窗口期,从数据更新到缓存失效这段时间内,读操作可能读到旧数据。
    • 如果失效的缓存被频繁访问,会导致大量的缓存穿透到数据库,增加数据库压力。

写前失效

  • 优点
    • 可以避免写后失效的缓存不一致窗口期,在读操作时可以保证读到最新数据。
    • 能有效减少缓存穿透问题,因为缓存提前失效,后续读操作就会重新从数据库加载数据并更新缓存。
  • 缺点
    • 实现相对复杂,需要在写操作前额外添加缓存失效逻辑。
    • 可能导致数据丢失,比如在删除缓存后,写数据库操作失败,此时缓存已失效而数据库数据未更新成功。

写时更新

  • 优点
    • 能即时保证缓存与数据库数据的一致性,不存在缓存不一致的窗口期。
    • 对读操作友好,读操作总能获取到最新数据。
  • 缺点
    • 实现成本高,需要同时更新数据库和缓存,增加了代码复杂度和事务管理难度。
    • 性能开销大,因为每次写操作都要更新缓存,在高并发场景下,缓存更新的压力较大,可能成为性能瓶颈。

业务场景权衡选择

  • 读多写少场景
    • 可以优先考虑写后失效策略,其实现简单,虽然存在缓存不一致窗口期,但读多写少场景下,写操作相对较少,缓存不一致时间较短,对整体业务影响较小。同时,可以通过合理设置缓存过期时间、使用缓存预热等方式来减少缓存穿透问题。
  • 写多读少场景
    • 写前失效或写时更新策略更为合适。写前失效能避免缓存不一致窗口期,且在写多读少场景下,缓存穿透问题也不会太严重;写时更新则能绝对保证数据一致性,但要注意优化性能,如采用异步更新缓存等方式。
  • 对数据一致性要求极高的场景
    • 写时更新策略是最佳选择,即使性能开销大,但能保证缓存与数据库数据实时一致。若性能问题突出,可以结合分布式缓存、缓存分片等技术来分担缓存更新压力。
  • 对数据一致性要求不高,但对性能要求极高的场景
    • 写后失效策略更为合适,通过牺牲一定时间内的缓存一致性来换取高性能,同时采取一些措施降低缓存穿透风险,如布隆过滤器等。