后端技术面试 38 讲
李智慧
同程艺龙交通首席架构师,前 Intel& 阿里架构师,《大型网站技术架构》作者
37373 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 46 讲
不定期加餐 (1讲)
后端技术面试 38 讲
15
15
1.0x
00:00/00:00
登录|注册

22 | 缓存架构:如何减少不必要的计算?

路由算法
热点数据 vs. 非热点数据
失效通知
过期失效
Memcached
对象缓存
反向代理缓存
CDN
提供更多的服务器
Memcached服务器集群扩容问题及解决方法
客户端缓存
优化软件性能
适用性
数据脏读问题
降低数据库和服务器的负载压力
减少CPU的计算消耗
响应速度更快
分布式缓存
Hash表
旁路缓存
通读缓存
提高数据响应速度
降低服务器的计算资源消耗
减少不必要的计算
采用分布式架构
高并发情况下的计算压力
思考题
缓存的普遍应用
缓存注意事项
缓存的好处
缓存实现
缓存类型
缓存的核心作用
解决思路
互联网应用的挑战
缓存架构

该思维导图由 AI 生成,仅供参考

上一篇我们讲到,互联网应用的主要挑战就是在高并发情况下,大量的用户请求到达应用系统服务器,造成了巨大的计算压力。互联网应用的核心解决思路就是采用分布式架构,提供更多的服务器,从而提供更多的计算资源,以应对高并发带来的计算压力及资源消耗。
那么有没有办法减少到达服务器的并发请求压力呢?或者请求到达服务器后,有没有办法减少不必要的计算,降低服务器的计算资源消耗,尽快返回计算结果给用户呢?
有,解决的核心就是缓存。
所谓缓存,就是将需要多次读取的数据暂存起来,这样在后面,应用程序需要多次读取的时候,就不必从数据源重复加载数据了,这样就可以降低数据源的计算负载压力,提高数据响应速度。
一般说来,缓存可以分成两种,通读缓存和旁路缓存。
通读(read-through)缓存应用程序访问通读缓存获取数据的时候,如果通读缓存有应用程序需要的数据,那么就返回这个数据;如果没有,那么通读缓存就自己负责访问数据源,从数据源获取数据返回给应用程序,并将这个数据缓存在自己的缓存中。这样,下次应用程序需要数据的时候,就可以通过通读缓存直接获得数据了。
通读缓存在架构中的位置与作用如下图:
旁路(cache-aside)缓存,应用程序访问旁路缓存获取数据的时候,如果旁路缓存中有应用程序需要的数据,那么就返回这个数据;如果没有,就返回空(null)。应用程序需要自己从数据源读取数据,然后将这个数据写入到旁路缓存中。这样,下次应用程序需要数据的时候,就可以通过旁路缓存直接获得数据了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

缓存架构在互联网应用中扮演着重要角色,能有效减轻服务器的计算压力和资源消耗。本文介绍了通读缓存和旁路缓存两种缓存方式。通读缓存包括CDN和反向代理缓存,能提高数据响应速度,减少网络带宽和服务器资源的消耗。对象缓存则是一种旁路缓存,通过Hash表实现快速存取。对于大型互联网应用,分布式缓存是必要的,通过构建缓存集群,共同提供缓存服务。分布式缓存的路由算法能有效地将数据存储在不同的服务器中,提高了缓存的效率和可靠性。文章通过介绍缓存架构的原理和应用,为读者提供了解决高并发计算压力的有效方法。 缓存的使用可以减少不必要的计算,提高数据响应速度,减少CPU计算消耗,降低数据库和服务器的负载压力。然而,缓存也存在数据脏读的问题,需要通过过期失效和失效通知来解决。此外,并非所有数据都适合缓存,只有热门数据才适合缓存存储。总的来说,缓存是优化软件性能的利器,几乎无处不在,对于互联网应用来说,使用缓存可以解决大部分性能问题。 除了系统架构缓存外,客户端也可以使用缓存,如App或浏览器中缓存数据,减少网络带宽和服务器资源消耗。最后,文章提出了一个思考题,探讨了在Memcached服务器集群扩容时可能遇到的问题以及解决方法。 总的来说,本文通过简洁明了的语言,深入浅出地介绍了缓存架构的原理和应用,对读者快速了解缓存的重要性和使用方法提供了有益的指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《后端技术面试 38 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • 探索无止境
    老师您好,文中提到缓存解决脏数据的方式失效通知,立即清理缓存,为什么实际采用的少?

    作者回复: 大部分业务场景可以接受短时间的读取脏数据,通知清理的方式带来的系统复杂性和压力得不偿失。

    2020-03-02
    2
    8
  • 不要挑战自己的智商
    旁路缓存的几段有点confusing..请问老师: 旁路缓存都是一个个的对象(id, 对象)是吗? 旁路缓存全都是本地缓存是吗?缓存和应用程序在同一个进程中启动,使用程序的堆空间存放缓存数据。这个缓存是由客户端应用来管理的,比如浏览器的缓存就是旁路缓存,是吗?

    作者回复: 旁路缓存都是一个个的对象(id, 对象)是吗? 是的 旁路缓存全都是本地缓存是吗? 分布式对象缓存也是 浏览器的缓存就是旁路缓存,是吗? 是的

    2020-07-31
    1
  • 非同凡想
    淘宝一般会在CDN放商品图片么?

    作者回复: 是的

    2020-03-28
    2
    1
  • holybell
    关于思考题,使用Memcached服务器数量参与hash余数算法,会导致服务器数量增减的时候,相同的路由被重新计算到不同的机器上,这就会导致每次增删Memcached服务器的时候,会导致大量的缓存失效,针对这个问题可以采用一致性哈希算法,将所有的服务器连接成一个逻辑上的环,采用一个不会改变运算逻辑的hash函数,当一个key计算出hash值的时候落到环上的某一个点,之后顺时针找到最近的一个服务器即可,这样即使删除Memcached服务器,只会导致该服务器的缓存转移到环上下一个点的服务器上,不会导致几乎整个Memcached集群缓存的失效;同时如果是增加Memcached机器,那么相当于从环路上的某个机器匀了一部分数据到新机器上,旧机器的缓存可以配合过期策略自动删除。
    2020-01-13
    3
    54
  • 桂冠远航
    这个专栏大而全是好事,但限于篇幅每个点都比较浅。
    2020-03-22
    2
    22
  • Paul Shan
    缓存是将数据的生产和消费解耦,在消费次数明显高于生产次数的现实中,让网络各个节点共享数据以减少无谓的数据生产。通路缓存节点必然位于数据生产者和数据消费者之间,当通路缓存不存在需要的数据的时候,就主动向生产者要数据,最终更新自己并把数据返回下家。通读缓存通常离数据消费者更近,因为这样才有效率。通读缓存在数据生产和消费者插入节点,有时也会增加生产者和消费者的距离,并不是万能的。CDN只适合于静态数据,因为动态数据更新快,缓存意义不大。反向代理也是在服务器和应用间插入一个节点,来代理服务器,个人觉得反向代理对于动态数据意义也不大。 旁路缓存则是数据消费者的衍生,数据消费者可能自己存不下那么多数据,就用旁路缓存来暂存结果,下次访问的时候先从旁路缓存读取,如果没有,再向数据生产者要数据,然后更新旁路缓存。旁路缓存需要存储大量数据,这个时候就需要将数据分配给不同的服务器,分配最好均匀,这和hash算法本质相同,因而有很多应用。 总结,通读代理是数据生成者的衍生,可以代理生产者。旁路缓存是数据消费者的衍生,可以想象成数据消费者外挂的内存或硬盘。通读缓存都存在于生产者和消费者之间的关键节点上,旁路缓存则是把这些关键节点扩容,让其有更好的性能。缓存是数据生产的一个快照,当其过了时效,也就失效了。
    2020-02-25
    1
    4
  • escray
    推荐去看一下隔壁《高并发系统设计 40 问》的缓存部分(可以试读有关缓存的 4 篇),我是为了最后的思考题,Memcached 的哈希一致性算法,而去看的。 缓存大概可以分为以下三类 旁路缓存 Cache Aside: 通路缓存 Read/Write Through: 写回缓存 Write Back:计算机体系结构中的设计,比如操作系统的 Page Cache 这篇专栏偏重于缓存架构的概要介绍,而高并发专栏里面提到了一些实际使用中的注意事项,配合服用疗效更好。当然,最终还是要到真实的使用场景中去学以致用。 除了 Memcached,也有把 Redis 来当做缓存使用的。 我觉的缓存受到限制的原因主要还是速度比较快的存储,费用昂贵——从 CPU 中的 L1 Cache、L2 Cache,一直到 Memcached 的内存数据库,CDN 和其他缓存技术,如果真的不考虑性价比的话,那么大量使用内存或者 SSD 等高速存储应该就可以了。
    2020-10-07
    3
  • 草原上的奔跑
    通读缓存、旁路缓存,第一次对缓存有了明确的认知。hash算法在扩缩容时会导致绝大多数缓存失效,这是它的问题。使用一致性hash算法可以降低失效缓存的数量,改善缓存的效率。但一致性hash也有自己的问题,比如平衡性问题等,又会针对这些问题提出解决方案。 之前看一些架构性的内容,不知道为何要这样做。听了李老师娓娓道来的讲述,明白了架构的演进,心里有些底,不再是飘在空中的感觉
    2020-01-16
    3
  • 俊杰
    会导致大量缓存不命中,可以用一致性哈希算法解决
    2020-01-13
    3
  • zqnba
    谢谢。提个建议: "首先就是数据脏读的问题,缓存的数据来自数据源,如果数据源中的数据被修改了,那么缓存中的数据就变成脏数据了。" 意思可以理解。不过这里的“脏读”,跟数据库事物的“脏读”定义不一致。有点容易混淆。
    2022-09-06归属地:日本
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部