分布式系统:图解缓存与数据库一致性问题
内容提要
缓存设计是应用系统设计中重要的一环,可以通过空间换取时间来提高性能。一致性分类包括强一致性、弱一致性和最终一致性。缓存更新机制包括被动更新和主动更新。缓存更新策略包括Cache-Aside、Read/Write Through、Write Behind。
延伸解读
一致性模型的选择:强一致性与最终一致性的权衡
文章将一致性分为强一致性、弱一致性和最终一致性。强一致性要求写入后立即能读到,适合秒杀、商家后台等场景,但对性能影响大。弱一致性不承诺立即读到,但会尽量在某个时间级别后达到一致。最终一致性是弱一致性的特例,保证在一定时间内达到一致,被大型分布式系统推崇,如微博粉丝数、页面访问数。选择时需根据业务对一致性的要求权衡性能与体验。
主动更新策略的四种组合与风险
主动更新由调用方同时更新缓存与数据库,根据操作顺序有四种组合:更新缓存再更新数据库、更新数据库再更新缓存、删除缓存再更新数据库、更新数据库再删除缓存。文章指出,前两种因不一致风险高或性能问题一般不采用;删除缓存再更新数据库在并发下可能因读比写快导致不一致,若采用需延迟双删,但会降低吞吐量。更新数据库再删除缓存(Cache-Aside)虽有小概率不一致,但更常用。
Read/Write Through 与 Write Behind 的适用场景
Read/Write Through 由缓存代理数据库操作,对应用层透明,简化代码,但需要分布式缓存组件支持,常见于本地缓存。Write Behind 只更新缓存,异步批量更新数据库,性能高,适合频繁写场景,如 MySQL InnoDB Buffer Pool,但数据可能丢失,强一致性要求高的系统需谨慎。文章强调没有通用方案,需根据场景权衡,强一致性可考虑分布式事务等协议。
Q&A
什么是缓存设计,它的目的是什么?
缓存设计是应用系统设计中的重要部分,目的是通过空间换取时间,提高数据访问性能。
一致性分类有哪些,分别有什么特点?
一致性分类包括强一致性、弱一致性和最终一致性。强一致性要求读写一致,弱一致性不承诺立即一致,最终一致性保证在一定时间内达到一致。
什么是Write Behind模式,它的优缺点是什么?
Write Behind模式只更新缓存,异步批量更新数据库,优点是提高性能,缺点是可能导致数据丢失和一致性问题。
如何实现缓存的主动更新和被动更新?
主动更新是调用方同时更新缓存与数据库,被动更新是在缓存过期后淘汰并重新加载数据。
Cache-Aside模式的工作流程是什么?
Cache-Aside模式先更新数据库,再删除缓存,可能导致不一致的情况,尤其在高并发时。
在高并发场景下,如何处理缓存与数据库的一致性问题?
在高并发场景下,需谨慎使用涉及删除缓存的方案,可能导致服务崩溃,建议使用分布式事务等强一致性协议。