【后端面经】【缓存】33|缓存模式:缓存模式能不能解决缓存一致性问题?

简介: 【5月更文挑战第9天】面试准备中,熟悉缓存模式如Cache Aside、Read Through、Write Through、Write Back、Singleflight,以及删除缓存和延迟双删策略,能解决缓存一致性、穿透、击穿和雪崩问题。在自我介绍时展示对缓存模式的理解,例如Cache Aside模式,它是基础模式,读写由业务控制,先写数据库以保证数据准确性,但无法解决所有一致性问题。Read Through模式在缓存未命中时自动从数据库加载数据,可异步加载优化响应时间,但也存在一致性挑战。

面试准备

缓存模式首先要确保自己能够记住这些模式,其次要在公司内部收集一些信息:

  • 公司有没有使用缓存模式,使用了哪些,有没有遇到过缓存一致性的问题,最后如何解决的?

  • 业务使用了缓存后,是如何更新缓存和数据库中的数据的?有没有一致性问题?

缓存模式用的好可以有效缓解数据一致性问题,也可以用于解决缓存穿透、击穿和雪崩的问题。

缓存模式简单来说就是系统里有缓存和数据库,读写数据都要操作这两者。

基本思路

自我介绍的时候提起缓存模式的话题

我对缓存模式有比较深刻的理解,平时会用缓存模式来解决很多问题,比如缓存穿透、雪崩和击穿。

如果面试官问了解哪些缓存模式或用过哪些缓存模式

缓存模式有Cache Aside、Read Through、Write Through、Write Back、Singleflight。除此以外,我还用过删除缓存和延迟双删。

严格意义上,删除缓存和延迟双删不是缓存模式,但是在面试中比较常见,可以顺便提一下。

Cache Aside

什么都不做的时候就是Cache Aside,这个模式把缓存看作一个独立的数据源,当写入的时候,业务方来控制写入顺序。
2024-05-10-21-02-36-image.png

当读取的时候也是由业务方来控制。

2024-05-10-21-02-57-image.png

你先介绍读写的基本操作

Cache Aside是最基本的缓存模式,在这个模式下,业务代码就是把缓存看成是和数据库一样独立的数据源,然后业务代码控制怎么写入缓存,怎么写入数据库。一般情况下,都是优先写入数据库。

最后一句提到了优先写入数据库,那么面试官就会追问为什么先写入数据库

先写数据库是因为大多数业务场景下数据都是以数据库为准的,也就是如果写入数据库成功了,就可以认为这个操作成功了。即使写入缓存失败,但是缓存本身会有过期时间,过期后重新加载,数据就会恢复一致。

最后要加一句总结

不管是先写数据库还是先写缓存,Cache Aside都不能解决数据一致性问题。

如果面试官追问为什么都不能解决,或者有什么不一致的场景,按照图里面的内容来回答就可以。注意观察图里的线程2,是后面开始执行,但是先结束的。
2024-05-10-21-18-35-image.png

Read Through

这个缓存模式叫做读穿透,核心是当缓存里没有数据的时候,缓存会代替你去数据库里面把数据加载出来,并且缓存起来。
2024-05-10-21-22-48-image.png

而写入的时候,就和 Cache Aside 一样。

Read Through 也是一个很常用的缓存模式。Read Through 是指在读缓存的时候,如果缓存未命中,那么缓存会代替业务代码去数据库中加载数据。

这种模式有两个异步变种,一种是异步写回缓存,一种是完全异步加载数据,然后写回缓存。当然,不管是什么变种,Read Through 都不能解决缓存一致性的问题。

可以注意到,Read Through 只管了读的部分,而写的部分是完全没有管的,所以它的写过程和 Cache Aside 是一样的。因此,它一样有缓存一致性的问题。要是面试官追问,你就用 Cache Aside 中的分析来回答。

最后我们提到异步加载数据,也就是为了引出亮点。

亮点:异步方案

Read Through模式在发现缓存里面没有数据的时候,加载数据、缓存起来这两个步骤是可以考虑异步执行的。所以可以先回答第一个变种。

缓存可以在从数据库加载了数据之后,立刻把数据返回业务代码,然后开启一个线程异步更新缓存。
2024-05-10-21-27-22-image.png

既然缓存数据这个步骤可以异步,那么从数据库中加载数据也可以异步。

第二个变种是直接让整个加载和回写缓存的过程都异步执行。也就是说,如果缓存未命中,那么就直接返回一个错误或者默认值,然后缓存异步地去数据库中加载,并且回写缓存。和第一个变种比起来,这种变种的缺陷是业务方在当次调用中只能拿到错误或者默认值。
2024-05-10-21-28-07-image.png

然后你可以总结一下什么场景可以使用这两个变种。

如果业务方对响应时间的要求非常苛刻,那么就可以考虑使用变种二。代价就是业务方会收到错误响应或者默认值。而变种一其实收益很小,只有在缓存操作很慢的时候才会考虑。比如说缓存大对象,又或者要把一个大对象序列化之后再存储到缓存里面。

目录
相关文章
|
2月前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
3月前
|
消息中间件 缓存 监控
如何保证缓存和数据库的一致性?
保证缓存和数据库的一致性的做法
|
16天前
|
缓存 NoSQL 关系型数据库
mysql和缓存一致性问题
本文介绍了五种常见的MySQL与Redis数据同步方法:1. 双写一致性,2. 延迟双删策略,3. 订阅发布模式(使用消息队列),4. 基于事件的缓存更新,5. 缓存预热。每种方法的实现步骤、优缺点均有详细说明。
|
25天前
|
缓存 监控 算法
小米面试题:多级缓存一致性问题怎么解决
【10月更文挑战第23天】在现代分布式系统中,多级缓存架构因其能够显著提高系统性能和响应速度而被广泛应用。
36 3
|
1月前
|
消息中间件 缓存 中间件
缓存一致性问题,这么回答肯定没毛病!
缓存一致性问题,这么回答肯定没毛病!
|
1月前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
61 4
|
1月前
|
存储 缓存 NoSQL
深入理解后端缓存机制的重要性与实践
本文将探讨在后端开发中缓存机制的应用及其重要性。缓存,作为提高系统性能和用户体验的关键技术,对于后端开发来说至关重要。通过减少数据库访问次数和缩短响应时间,缓存可以显著提升应用程序的性能。本文将从缓存的基本概念入手,介绍常见的缓存策略和实现方式,并通过实例展示如何在后端开发中有效应用缓存技术。最后,我们将讨论缓存带来的一些挑战及其解决方案,帮助您在实际项目中更好地利用缓存机制。
|
2月前
|
机器学习/深度学习 缓存 NoSQL
深度学习在图像识别中的应用与挑战后端开发中的数据缓存策略
本文深入探讨了深度学习技术在图像识别领域的应用,包括卷积神经网络(CNN)的原理、常见模型如ResNet和VGG的介绍,以及这些模型在实际应用中的表现。同时,文章也讨论了数据增强、模型集成等改进性能的方法,并指出了当前面临的计算资源需求高、数据隐私等挑战。通过综合分析,本文旨在为深度学习在图像识别中的进一步研究和应用提供参考。 本文探讨了后端开发中数据缓存的重要性和实现方法,通过具体案例解析Redis在实际应用中的使用。首先介绍了缓存的基本概念及其在后端系统性能优化中的作用;接着详细讲解了Redis的常见数据类型和应用场景;最后通过一个实际项目展示了如何在Django框架中集成Redis,
|
2月前
|
消息中间件 缓存 NoSQL
奇怪的缓存一致性问题
本文记录了缓存一致性问题的排查过程和解决方案,同时带读者朋友们一起回顾下相关的八股文。
|
2月前
|
缓存 NoSQL 关系型数据库
MySQL与Redis缓存一致性的实现与挑战
在现代软件开发中,MySQL作为关系型数据库管理系统,广泛应用于数据存储;而Redis则以其高性能的内存数据结构存储特性,常被用作缓存层来提升数据访问速度。然而,当MySQL与Redis结合使用时,确保两者之间的数据一致性成为了一个重要且复杂的挑战。本文将从技术角度分享MySQL与Redis缓存一致性的实现方法及其面临的挑战。
144 2