22 | 缓存架构:如何减少不必要的计算?
李智慧
该思维导图由 AI 生成,仅供参考
上一篇我们讲到,互联网应用的主要挑战就是在高并发情况下,大量的用户请求到达应用系统服务器,造成了巨大的计算压力。互联网应用的核心解决思路就是采用分布式架构,提供更多的服务器,从而提供更多的计算资源,以应对高并发带来的计算压力及资源消耗。
那么有没有办法减少到达服务器的并发请求压力呢?或者请求到达服务器后,有没有办法减少不必要的计算,降低服务器的计算资源消耗,尽快返回计算结果给用户呢?
有,解决的核心就是缓存。
所谓缓存,就是将需要多次读取的数据暂存起来,这样在后面,应用程序需要多次读取的时候,就不必从数据源重复加载数据了,这样就可以降低数据源的计算负载压力,提高数据响应速度。
一般说来,缓存可以分成两种,通读缓存和旁路缓存。
通读(read-through)缓存,应用程序访问通读缓存获取数据的时候,如果通读缓存有应用程序需要的数据,那么就返回这个数据;如果没有,那么通读缓存就自己负责访问数据源,从数据源获取数据返回给应用程序,并将这个数据缓存在自己的缓存中。这样,下次应用程序需要数据的时候,就可以通过通读缓存直接获得数据了。
通读缓存在架构中的位置与作用如下图:
旁路(cache-aside)缓存,应用程序访问旁路缓存获取数据的时候,如果旁路缓存中有应用程序需要的数据,那么就返回这个数据;如果没有,就返回空(null)。应用程序需要自己从数据源读取数据,然后将这个数据写入到旁路缓存中。这样,下次应用程序需要数据的时候,就可以通过旁路缓存直接获得数据了。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
缓存架构在互联网应用中扮演着重要角色,能有效减轻服务器的计算压力和资源消耗。本文介绍了通读缓存和旁路缓存两种缓存方式。通读缓存包括CDN和反向代理缓存,能提高数据响应速度,减少网络带宽和服务器资源的消耗。对象缓存则是一种旁路缓存,通过Hash表实现快速存取。对于大型互联网应用,分布式缓存是必要的,通过构建缓存集群,共同提供缓存服务。分布式缓存的路由算法能有效地将数据存储在不同的服务器中,提高了缓存的效率和可靠性。文章通过介绍缓存架构的原理和应用,为读者提供了解决高并发计算压力的有效方法。 缓存的使用可以减少不必要的计算,提高数据响应速度,减少CPU计算消耗,降低数据库和服务器的负载压力。然而,缓存也存在数据脏读的问题,需要通过过期失效和失效通知来解决。此外,并非所有数据都适合缓存,只有热门数据才适合缓存存储。总的来说,缓存是优化软件性能的利器,几乎无处不在,对于互联网应用来说,使用缓存可以解决大部分性能问题。 除了系统架构缓存外,客户端也可以使用缓存,如App或浏览器中缓存数据,减少网络带宽和服务器资源消耗。最后,文章提出了一个思考题,探讨了在Memcached服务器集群扩容时可能遇到的问题以及解决方法。 总的来说,本文通过简洁明了的语言,深入浅出地介绍了缓存架构的原理和应用,对读者快速了解缓存的重要性和使用方法提供了有益的指导。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《后端技术面试 38 讲》,新⼈⾸单¥59
《后端技术面试 38 讲》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(14)
- 最新
- 精选
- 探索无止境老师您好,文中提到缓存解决脏数据的方式失效通知,立即清理缓存,为什么实际采用的少?
作者回复: 大部分业务场景可以接受短时间的读取脏数据,通知清理的方式带来的系统复杂性和压力得不偿失。
2020-03-0228 - 不要挑战自己的智商旁路缓存的几段有点confusing..请问老师: 旁路缓存都是一个个的对象(id, 对象)是吗? 旁路缓存全都是本地缓存是吗?缓存和应用程序在同一个进程中启动,使用程序的堆空间存放缓存数据。这个缓存是由客户端应用来管理的,比如浏览器的缓存就是旁路缓存,是吗?
作者回复: 旁路缓存都是一个个的对象(id, 对象)是吗? 是的 旁路缓存全都是本地缓存是吗? 分布式对象缓存也是 浏览器的缓存就是旁路缓存,是吗? 是的
2020-07-311 - 非同凡想淘宝一般会在CDN放商品图片么?
作者回复: 是的
2020-03-2821 - holybell关于思考题,使用Memcached服务器数量参与hash余数算法,会导致服务器数量增减的时候,相同的路由被重新计算到不同的机器上,这就会导致每次增删Memcached服务器的时候,会导致大量的缓存失效,针对这个问题可以采用一致性哈希算法,将所有的服务器连接成一个逻辑上的环,采用一个不会改变运算逻辑的hash函数,当一个key计算出hash值的时候落到环上的某一个点,之后顺时针找到最近的一个服务器即可,这样即使删除Memcached服务器,只会导致该服务器的缓存转移到环上下一个点的服务器上,不会导致几乎整个Memcached集群缓存的失效;同时如果是增加Memcached机器,那么相当于从环路上的某个机器匀了一部分数据到新机器上,旧机器的缓存可以配合过期策略自动删除。2020-01-13354
- 桂冠远航这个专栏大而全是好事,但限于篇幅每个点都比较浅。2020-03-22222
- Paul Shan缓存是将数据的生产和消费解耦,在消费次数明显高于生产次数的现实中,让网络各个节点共享数据以减少无谓的数据生产。通路缓存节点必然位于数据生产者和数据消费者之间,当通路缓存不存在需要的数据的时候,就主动向生产者要数据,最终更新自己并把数据返回下家。通读缓存通常离数据消费者更近,因为这样才有效率。通读缓存在数据生产和消费者插入节点,有时也会增加生产者和消费者的距离,并不是万能的。CDN只适合于静态数据,因为动态数据更新快,缓存意义不大。反向代理也是在服务器和应用间插入一个节点,来代理服务器,个人觉得反向代理对于动态数据意义也不大。 旁路缓存则是数据消费者的衍生,数据消费者可能自己存不下那么多数据,就用旁路缓存来暂存结果,下次访问的时候先从旁路缓存读取,如果没有,再向数据生产者要数据,然后更新旁路缓存。旁路缓存需要存储大量数据,这个时候就需要将数据分配给不同的服务器,分配最好均匀,这和hash算法本质相同,因而有很多应用。 总结,通读代理是数据生成者的衍生,可以代理生产者。旁路缓存是数据消费者的衍生,可以想象成数据消费者外挂的内存或硬盘。通读缓存都存在于生产者和消费者之间的关键节点上,旁路缓存则是把这些关键节点扩容,让其有更好的性能。缓存是数据生产的一个快照,当其过了时效,也就失效了。2020-02-2514
- 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-073
- 草原上的奔跑通读缓存、旁路缓存,第一次对缓存有了明确的认知。hash算法在扩缩容时会导致绝大多数缓存失效,这是它的问题。使用一致性hash算法可以降低失效缓存的数量,改善缓存的效率。但一致性hash也有自己的问题,比如平衡性问题等,又会针对这些问题提出解决方案。 之前看一些架构性的内容,不知道为何要这样做。听了李老师娓娓道来的讲述,明白了架构的演进,心里有些底,不再是飘在空中的感觉2020-01-163
- 俊杰会导致大量缓存不命中,可以用一致性哈希算法解决2020-01-133
- zqnba谢谢。提个建议: "首先就是数据脏读的问题,缓存的数据来自数据源,如果数据源中的数据被修改了,那么缓存中的数据就变成脏数据了。" 意思可以理解。不过这里的“脏读”,跟数据库事物的“脏读”定义不一致。有点容易混淆。2022-09-06归属地:日本
收起评论