【后端面经】【缓存】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

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

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

目录
相关文章
|
19天前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
2月前
|
消息中间件 缓存 监控
如何保证缓存和数据库的一致性?
保证缓存和数据库的一致性的做法
|
8天前
|
机器学习/深度学习 缓存 NoSQL
深度学习在图像识别中的应用与挑战后端开发中的数据缓存策略
本文深入探讨了深度学习技术在图像识别领域的应用,包括卷积神经网络(CNN)的原理、常见模型如ResNet和VGG的介绍,以及这些模型在实际应用中的表现。同时,文章也讨论了数据增强、模型集成等改进性能的方法,并指出了当前面临的计算资源需求高、数据隐私等挑战。通过综合分析,本文旨在为深度学习在图像识别中的进一步研究和应用提供参考。 本文探讨了后端开发中数据缓存的重要性和实现方法,通过具体案例解析Redis在实际应用中的使用。首先介绍了缓存的基本概念及其在后端系统性能优化中的作用;接着详细讲解了Redis的常见数据类型和应用场景;最后通过一个实际项目展示了如何在Django框架中集成Redis,
|
29天前
|
消息中间件 缓存 NoSQL
奇怪的缓存一致性问题
本文记录了缓存一致性问题的排查过程和解决方案,同时带读者朋友们一起回顾下相关的八股文。
|
1月前
|
缓存 NoSQL 关系型数据库
MySQL与Redis缓存一致性的实现与挑战
在现代软件开发中,MySQL作为关系型数据库管理系统,广泛应用于数据存储;而Redis则以其高性能的内存数据结构存储特性,常被用作缓存层来提升数据访问速度。然而,当MySQL与Redis结合使用时,确保两者之间的数据一致性成为了一个重要且复杂的挑战。本文将从技术角度分享MySQL与Redis缓存一致性的实现方法及其面临的挑战。
64 2
|
2月前
|
缓存 网络协议 API
【API管理 APIM】APIM中对后端API服务的DNS域名缓存问题
【API管理 APIM】APIM中对后端API服务的DNS域名缓存问题
|
2月前
|
存储 缓存 JavaScript
深入理解后端开发中的缓存机制
【8月更文挑战第31天】本文将通过一个实际的后端开发案例,介绍如何有效地使用缓存来提高应用性能。我们将从基础概念开始,逐步深入到缓存策略的实施,最后通过代码示例展示如何在Node.js环境中实现一个简单的缓存系统。无论你是缓存新手还是希望优化现有系统的开发者,这篇文章都将为你提供实用的指导和启示。
|
2月前
|
消息中间件 缓存 监控
go-zero微服务实战系列(六、缓存一致性保证)
go-zero微服务实战系列(六、缓存一致性保证)
|
2月前
|
存储 缓存 关系型数据库
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
35 0
|
2月前
|
存储 缓存 数据库
Django后端架构开发:信号与缓存架构开发
Django后端架构开发:信号与缓存架构开发
65 0