面试题答案
一键面试常见缓存更新策略及优缺点
- Cache-Aside(旁路缓存)策略
- 优点:
- 实现简单,应用程序逻辑相对清晰,只需在读取和写入数据时额外操作缓存。
- 数据一致性较好,先更新数据库,再删除缓存,能保证最终一致性。
- 缺点:
- 并发场景下可能出现缓存和数据库数据不一致问题。例如,高并发时,A线程先读取数据到缓存,B线程更新数据库后删除缓存,A线程又写入旧数据到缓存。
- 写操作性能相对低,因为每次写操作都涉及数据库和缓存两次操作。
- 优点:
- Read-Through(读穿)策略
- 优点:
- 应用程序只需关注从缓存读取数据,无需关心缓存是否存在,缓存加载由缓存服务内部处理,简化应用逻辑。
- 能提高缓存命中率,因为缓存缺失时会自动加载数据到缓存。
- 缺点:
- 增加了缓存服务的复杂度,需要缓存服务具备从数据源加载数据的能力。
- 首次读取数据时,如果缓存未命中,会有额外的数据源读取延迟。
- 优点:
- Write-Through(写穿)策略
- 优点:
- 数据一致性非常高,每次写操作都同时更新数据库和缓存,保证两者数据实时一致。
- 应用程序无需额外处理缓存更新逻辑,由缓存服务负责。
- 缺点:
- 写操作性能较差,因为每次写都要等待数据库和缓存更新完成,可能成为系统性能瓶颈。
- 对缓存服务依赖度高,如果缓存服务故障,会影响写操作。
- 优点:
- Write-Behind(写后更新/异步缓存写入)策略
- 优点:
- 写操作性能极高,数据写入先在缓存,然后异步批量更新到数据库,能显著提高系统吞吐量。
- 适用于对数据一致性要求不是特别高的场景,能有效减少数据库I/O压力。
- 缺点:
- 数据一致性较差,缓存和数据库可能长时间存在不一致情况,特别是在系统故障时可能丢失数据。
- 实现复杂,需要处理异步任务、重试机制等,增加开发和运维成本。
- 优点:
实际场景中策略选择
- 对数据一致性要求极高:
- 如金融交易场景,适合Write-Through策略,确保数据库和缓存数据实时一致,但要考虑性能优化,如使用高性能数据库和缓存集群。
- 读多写少且对一致性要求较高:
- 电商商品详情页展示场景,Cache-Aside策略较为合适,通过合理的缓存过期时间和并发控制,能在保证一致性的同时兼顾性能。
- 读多写少且希望简化应用逻辑:
- 内容管理系统的文章展示场景,Read-Through策略可简化应用程序对缓存的操作,提高缓存命中率。
- 写多读少且对一致性要求不高:
- 日志记录场景,Write-Behind策略能大幅提升写性能,通过异步批量写入数据库,减轻数据库压力,但要注意数据丢失风险。