面试题答案
一键面试写后失效
- 优点:
- 实现简单,在数据更新后直接让缓存失效,开发成本低。
- 对业务代码侵入性小,不影响正常的写操作流程。
- 缺点:
- 存在缓存不一致窗口期,从数据更新到缓存失效这段时间内,读操作可能读到旧数据。
- 如果失效的缓存被频繁访问,会导致大量的缓存穿透到数据库,增加数据库压力。
写前失效
- 优点:
- 可以避免写后失效的缓存不一致窗口期,在读操作时可以保证读到最新数据。
- 能有效减少缓存穿透问题,因为缓存提前失效,后续读操作就会重新从数据库加载数据并更新缓存。
- 缺点:
- 实现相对复杂,需要在写操作前额外添加缓存失效逻辑。
- 可能导致数据丢失,比如在删除缓存后,写数据库操作失败,此时缓存已失效而数据库数据未更新成功。
写时更新
- 优点:
- 能即时保证缓存与数据库数据的一致性,不存在缓存不一致的窗口期。
- 对读操作友好,读操作总能获取到最新数据。
- 缺点:
- 实现成本高,需要同时更新数据库和缓存,增加了代码复杂度和事务管理难度。
- 性能开销大,因为每次写操作都要更新缓存,在高并发场景下,缓存更新的压力较大,可能成为性能瓶颈。
业务场景权衡选择
- 读多写少场景:
- 可以优先考虑写后失效策略,其实现简单,虽然存在缓存不一致窗口期,但读多写少场景下,写操作相对较少,缓存不一致时间较短,对整体业务影响较小。同时,可以通过合理设置缓存过期时间、使用缓存预热等方式来减少缓存穿透问题。
- 写多读少场景:
- 写前失效或写时更新策略更为合适。写前失效能避免缓存不一致窗口期,且在写多读少场景下,缓存穿透问题也不会太严重;写时更新则能绝对保证数据一致性,但要注意优化性能,如采用异步更新缓存等方式。
- 对数据一致性要求极高的场景:
- 写时更新策略是最佳选择,即使性能开销大,但能保证缓存与数据库数据实时一致。若性能问题突出,可以结合分布式缓存、缓存分片等技术来分担缓存更新压力。
- 对数据一致性要求不高,但对性能要求极高的场景:
- 写后失效策略更为合适,通过牺牲一定时间内的缓存一致性来换取高性能,同时采取一些措施降低缓存穿透风险,如布隆过滤器等。