后端工程师的高阶面经
邓明
前 Shopee 高级工程师,Beego PMC
6888 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
后端工程师的高阶面经
15
15
1.0x
00:00/00:00
登录|注册

33|缓存模式:缓存模式能不能解决缓存一致性问题?

你好,我是大明。今天我们来学习缓存的另外一个热点——缓存模式。
缓存模式在面试中属于高频问题,但是大部分人的回答都会有两个缺陷:一个是不够完整,也就是只知道一部分缓存模式;另外一个是不够深入,也就是只能泛泛而谈。尤其是有些面试官会故意问你怎么用缓存模式来解决一致性问题,你就有可能上当。
那么这节课我就带你深入分析每一个缓存模式,并且讨论它的优缺点以及在数据一致性方面的表现。
让我们直接从面试准备开始。

面试准备

缓存模式你首先要确保自己能够记住这些模式,其次要在公司内部收集一些信息。
你们公司有没有使用缓存模式,使用了哪些,有没有遇到过缓存一致性的问题,最终是如何解决的?
你的业务中使用了缓存之后,你是如何更新缓存和数据库中的数据的?有没有一致性问题?
缓存模式用得好可以有效缓解数据一致性的问题,也可以用于解决缓存穿透、击穿和雪崩的问题。这两个话题我们课程后面会进一步讨论,你要结合在一起理解。
为了便于你理解,我们用一个简化模型来解释缓存模式,也就是你的系统里面有缓存和数据库,你读写数据都要操作这两者。

基本思路

在最开始面试的时候,你可以在自我介绍的时候提起缓存模式的话题。
我对缓存模式有比较深刻的理解,平时会用缓存模式来解决很多问题,比如说缓存穿透、雪崩和击穿。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了不同的缓存模式及其在数据一致性方面的表现。文章首先强调了面试准备的重要性,建议收集公司内部关于缓存模式的信息。接着详细介绍了缓存模式的基本思路,包括 Cache Aside、Read Through 和 Write Through。对于每种模式,文章分析了其优缺点以及在数据一致性方面的表现,并提出了相应的异步方案和亮点。最后,文章总结了每种模式的适用场景和注意事项,为读者提供了全面的缓存模式知识。通过本文的总结,读者可以快速了解不同缓存模式的特点和应用场景,为解决实际问题提供了有力的参考。文章内容丰富,涵盖了多种缓存模式及其在数据一致性方面的表现,为读者提供了全面的缓存模式知识。文章还提到了使用装饰器模式实现缓存模式的亮点方案,以及面试思路总结和思考题,为读者提供了更多实践和思考的机会。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《后端工程师的高阶面经》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • 一弦一柱思华年
    其实readThrough/writeThrough只不过是在cache aside基础上将一些操作封装成一个函数了,但本质上没啥区别。可以这么理解吗

    作者回复: 对。本身这些缓存模式都差不多。

    2023-12-28归属地:广东
    4
  • peter
    请教老师两个问题: Q1:Cache Aside的第一个图,写入数据库的时候,为什么缓存返回OK? Q2:SingleFlight模式,谁来控制线程?根据什么来选择一个访问的线程?

    作者回复: 啊啊,画图事务,我联系小编改改!

    2023-09-04归属地:河南
    2
    1
  • NullPointerException
    write through 我看网上更新缓存和数据库是在一个事务中,这样应该没有一致性问题吧?

    作者回复: 有。你更新缓存成功了,但是数据库事务提交失败了,怎么办?

    2023-12-14归属地:上海
  • Geek_fef55b
    老师,请问一下,在Write Through模式中让缓存自己去更新数据库这个操作,是如何实现的呀?

    作者回复: 调用一下 DB 就可以。如果你想设计良好的,你可能需要有一个 Store(key, val) 的接口,然后这个接口的实现就是 DB 插入到数据库。

    2023-11-23归属地:北京
  • 锅菌鱼
    老师,分布式Singleflight的有什么最佳实践的实现方案吗

    作者回复: 这个在 GO 里面有一个自带的,还是很好用的。在 JAVA 那边的话,得找找开源框架,我几年没写 JAVA,已经不太记得了。

    2023-10-08归属地:广东
    2
  • Geek8004
    Singleflight为啥之歌模式要加分布式锁呀,redis不是单线程的吗,那我理解这种读的写的请求会在等待队列里面排队呀

    作者回复: 这个是为了避免一台实例有多个线程去抢分布式锁。就好比,你高三这一个年级有十个班。现在有一种比赛,如果你说任何人都可以报名参加,那么就是十个班的所有学生一起去抢夺金牌。 引入 singleflight 的意思就是,你每个班先自己内部比一比,选出一个,那么在整个年级上,就是十个人在抢夺金牌。

    2023-09-14归属地:中国香港
  • Geek8004
    让缓存去更新数据库,然后缓存自己删除自己的数据. 这个怎么实现的,没这么玩儿过. 缓存里面没有菜做的空间呀,一般都是业务里面才能写代码,发指令吗? redis怎么更新db? 监听相关事件? 还是怎么地. 老师求指点

    作者回复: 你的缓存中间件帮你封装,我在 Beego 的 Cache 里面让我的小伙伴实现了。你可以去看看

    2023-09-11归属地:日本
  • itschenxiang
    Cache Aside有文中这种广义的定义吗?facebook论文和网上提到的Cache Aside策略都非常具体:更新时,先更新DB,再删除缓存。

    作者回复: 我不觉得,Aside 这里面包含了一定要删除缓存。 个人认为,Aside 强调的是,我缓存也是作为一个独立的数据源。

    2023-09-04归属地:广东
  • shikamaru
    老师,“Write Through 没有要求先写数据库还是先写缓存,不过一般也是先写数据库”这句存疑,Read/Write Through 读写都是先操作cache才对呀,不然不符合“Read/Write Through”的字面意思
    2024-03-14归属地:四川
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部