阿里架构师详解缓存架构:如何减少不必要的计算?

【全栈架构师高级研修】架构设计方法论 🏗️:本文揭示阿里P8/腾讯T4级架构设计思维,涵盖复杂系统抽象、技术选型决策、架构演进策略等核心能力,内含12个架构设计模式、9个真实案例复盘和5套架构评估模型。文末附「架构设计模式速查手册」。 阅读详情

本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等

互联网应用的主要挑战就是在高并发情况下,大量的用户请求到达应用系统服务器,造成了巨大的计算压力。互联网应用的核心解决思路就是采用分布式架构,提供更多的服务器,从而提供更多的计算资源,以应对高并发带来的计算压力及资源消耗。

那么有没有办法减少到达服务器的并发请求压力呢?或者请求到达服务器后,有没有办法减少不必要的计算,降低服务器的计算资源消耗,尽快返回计算结果给用户呢?

有,解决的核心就是缓存。

所谓缓存,就是将需要多次读取的数据暂存起来,这样在后面,应用程序需要多次读取的时候,就不必从数据源重复加载数据了,这样就可以降低数据源的计算负载压力,提高数据响应速度。

一般说来,缓存可以分成两种,通读缓存和旁路缓存。

通读(read-through)缓存,应用程序访问通读缓存获取数据的时候,如果通读缓存有应用程序需要的数据,那么就返回这个数据;如果没有,那么通读缓存就自己负责访问数据源,从数据源获取数据返回给应用程序,并将这个数据缓存在自己的缓存中。这样,下次应用程序需要数据的时候,就可以通过通读缓存直接获得数据了。

通读缓存在架构中的位置与作用如下图:

旁路(cache-aside)缓存,应用程序访问旁路缓存获取数据的时候,如果旁路缓存中有应用程序需要的数据,那么就返回这个数据;如果没有,就返回空(null)。应用程序需要自己从数据源读取数据,然后将这个数据写入到旁路缓存中。这样,下次应用程序需要数据的时候,就可以通过旁路缓存直接获得数据了。

旁路缓存在架构中位置与作用如下图:

通读缓存

互联网应用中主要使用的通读缓存是 CDN 和反向代理缓存。

CDN(Content Delivery Network)即内容分发网络。我们上网的时候,App 或者浏览器想要连接到互联网应用的服务器,需要网络服务商,比如移动、电信这样的服务商为我们提供网络服务,建立网络连接才可以上网。

而这些服务商需要在全国范围内部署骨干网络、交换机机房才能完成网络连接服务,这些交换机机房可能会离用户非常近,那么互联网应用能不能在这些交换机机房中部署缓存缓存服务器呢?这样,用户就可以近距离获得自己需要的数据,既提高了响应速度,又节约了网络带宽和服务器资源。

当然可以。这个部署在网络服务商机房中的缓存就是 CDN,因为距离用户非常近,又被称作网络连接的第一跳。目前很多互联网应用大约 80% 以上的网络流量都是通过 CDN 返回的。

CDN 只能缓存静态数据内容,比如图片、CSS、JS、HTML 等内容。而动态的内容,比如订单查询、商品搜索结果等必须要应用服务器进行计算处理后才能获得。因此,互联网应用的静态内容和动态内容需要进行分离,静态内容和动态内容部署在不同的服务器集群上,使用不同的二级域名,即所谓的动静分离,一方面便于运维管理,另一方面也便于 CDN 进行缓存,使 CDN 只缓存静态内容。

反向代理缓存也是一种通读缓存。我们上网的时候,有时候需要通过代理上网,这个代理是代理我们的客户端上网设备。而反向代理则代理服务器,是应用程序服务器的门户,所有的网络请求都需要通过反向代理才能到达应用程序服务器。既然所有的请求都需要通过反向代理才能到达应用服务器,那么在这里加一个缓存,尽快将数据返回给用户,而不是发送给应用服务器,这就是反向代理缓存。

用户请求到达反向代理缓存服务器,反向代理检查本地是否有需要的数据,如果有就直接返回,如果没有,就请求应用服务器,得到需要的数据后缓存在本地,然后返回给用户。

旁路缓存

CDN 和反向代理缓存通常会作为系统架构的一部分,很多时候对应用程序是透明的。而应用程序在代码中主要使用的是对象缓存,对象缓存是一种旁路缓存。

不管是通读缓存还是旁路缓存,缓存通常都是以 <key, value> 的方式存储在缓存中,比如,CDN 和反向代理缓存中,每个 URL 是一个 key,那么 URL 对应的文件内容就是value。而对象缓存中,key 通常是一个 ID,比如用户 ID,商品 ID 等等,而 value 则是一个对象,就是 ID 对应的用户对象或者商品对象。

对于 <key, value> 的数据格式,我们在前面在数据结构讨论过,比较快速的存取方式是使用 Hash 表。因此通读缓存和旁路缓存在实现上,基本上用的是 Hash 表。

程序中使用的对象缓存,可以分成两种。一种是本地缓存,缓存和应用程序在同一个进程中启动,使用程序的堆空间存放缓存数据。本地缓存的响应速度快,但是缓存可以使用的内存空间相对比较小,但是对于大型互联网应用所需要缓存的数据通以 T 计,这时候就要使用远程的分布式缓存了。

分布式缓存是指将一组服务器构成一个缓存集群,共同对外提供缓存服务,那么应用程序在每次读写缓存的时候,如何知道要访问缓存集群中的哪台服务器呢?我们以 Memcached为例,看看分布式缓存的架构:

Memcached 将多台服务器构成一个缓存集群,缓存数据存储在每台服务器的内存中。事实上,使用缓存的应用程序服务器通常也是以集群方式部署的,每个程序需要依赖一个Memcached 的客户端 SDK,通过 SDK 的 API 访问 Memcached 的服务器。

应用程序调用 API,API 调用 SDK 的路由算法,路由算法根据缓存的 key 值,计算这个key 应该访问哪台 Memcached 服务器,计算得到服务器的 IP 地址和端口号后,API 再调用 SDK 的通信模块,将 <key, value> 值以及缓存操作命令发送给具体的某台Memcached 服务器,由这台服务器完成缓存操作。

那么,路由算法又是如何计算得到 Memcached 的服务器 IP 端口呢?比较简单的一种方法,和 Hash 算法一样,利用 key 的 Hash 值对服务器列表长度取模,根据余数就可以确定服务器列表的下标,进而得到服务器的 IP 和端口。

缓存注意事项

使用缓存可以减少不必要的计算,能够带来三个方面的好处:

  1. 缓存的数据通常存储在内存中,距离使用数据的应用也更近一点,因此相比从硬盘上获取,或者从远程网络上获取,它获取数据的速度更快一点,响应时间更快,性能表现更好。
  2. 缓存的数据通常是计算结果数据,比如对象缓存中,通常存放经过计算加工的结果对象,如果缓存不命中,那么就需要从数据库中获取原始数据,然后进行计算加工才能得到结果对象,因此使用缓存可以减少 CPU 的计算消耗,节省计算资源,同样也加快了处理的速度。
  3. 通过对象缓存获取数据,可以降低数据库的负载压力;通过 CDN、反向代理等通读缓存获取数据,可以降低服务器的负载压力。这些被释放出来的计算资源,可以提供给其他更有需要的计算场景,比如写数据的场景,间接提高整个系统的处理能力。

但是缓存也不是万能的,如果不恰当地使用缓存,也可能会带来问题。

首先就是数据脏读的问题,缓存的数据来自数据源,如果数据源中的数据被修改了,那么缓存中的数据就变成脏数据了。

主要解决办法有两个,一个是过期失效,每次写入缓存中的数据都标记其失效时间,在读取缓存的时候,检查数据是否已经过期失效,如果失效,就重新从数据源获取数据。缓存失效依然可能会在未失效时间内读到脏数据,但是一般的应用都可以容忍较短时间的数据不一致,比如淘宝卖家更新了商品信息,那么几分钟数据没有更新到缓存,买家看到的还是旧数据,这种情况通常是可以接受的,这时候,就可以设置缓存失效时间为几分钟。

另一个办法就是失效通知,应用程序更新数据源的数据,同时发送通知,将该数据从缓存中清除。失效通知看起来数据更新更加及时,但是实践中,更多使用的还是过期失效。

此外,并不是所有数据使用缓存都有意义。在互联网应用中,大多数数据访问都是有热点的,比如热门微博会被更多阅读,热门商品会被更多浏览。那么将这些热门的数据保存在缓存中是有意义的,因为缓存通常使用内存,存储空间比较有限,只能存储有限的数据,热门数据存储在缓存中,可以被更多次地读取,缓存效率也比较高。

相反,如果缓存的数据没有热点,写入缓存的数据很难被重复读取,那么使用缓存就不是很有必要了。

总结

缓存是优化软件性能的杀手锏,任何需要查询数据、请求数据的场合都可以考虑使用缓存。缓存几乎是无处不在的,程序代码中可以使用缓存,网络架构中可以使用缓存,CPU、操作系统、虚拟机也大量使用缓存,事实上,缓存最早就是在 CPU 中使用的。对于一个典型的互联网应用而言,使用缓存可以解决绝大部分的性能问题,如果需要优化软件性能,那么可以优先考虑哪里可以使用缓存改善性能。

除了本文提到的系统架构缓存外,客户端也可以使用缓存,在 App 或者浏览器中缓存数据,甚至都不需要消耗网络带宽资源,也不会消耗 CDN、反向代理的内存资源,更不会消耗服务器的计算资源。

阿里提示工程架构师实践:高可用架构的根因分析(从现象到本质的5个方法) 高可用是互联网大规模系统的“生命线”,而根因分析(Root Cause Analysis, RCA)则是维持这条生命线的“手术刀”——它不仅要解决表面的故障现象,更要定位系统本质的缺陷。本文结合阿里集团(如支付宝、淘宝)在大规模分布式系统中的实践经验,提炼出从现象到本质的5个根因分析方法现象还原法路径追踪法第一性原理溯源法多维度验证法闭环改进法。 阅读详情

相关推荐

进阶Java架构师必看的15本书

1、大型网站技术架构:核心原理与案例分析 本书通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计案例,为读者呈现一幅包括技术选型、架构设计、性能优化、Web安全、系统发布、运维监控等在内的大型网站开发全景视图。 本书作者李智慧,曾在阿里巴巴担任技术专家,参与阿里巴巴基础技术平台开发和架构设计。 image 2、分...

李旭的博客 2747

jetcache:阿里这款多级缓存框架一定要掌握

jetcache是阿里开源的基于java开发的缓存框架,支持多种缓存类型:本地缓存、分布式缓存、多级缓存。能够满足不同业务场景的缓存需求。jetcache具有上手简单、性能高效、拓展性强的特点。支持缓存预热 、缓存key前缀等功能。结合spring-cache使用,可以实现十分优雅的缓存类型切换。

55555的博客 4036

Glide缓存架构深度剖析:四大致命缺陷与阿里P8级优化方案

Glide默认缓存架构存在内存分配僵化、磁盘混存、网络加载无优先级及资源回收滞后四大缺陷。阿里P8级优化方案通过动态权重内存缓存、磁盘冷热分区、滑动感知优先级管理及智能资源回收机制,显著降低OOM率、提升缓存命中率与加载性能,适配高低端设备与复杂业务场景。

全栈 1048

2019-阿里,缓存架构技术

这部分将结合我自己的经验,为大家准备面试提供一个参考。 3.1 尽早开始准备 首先,尽早开始准备。足够的时间是充足的准备的基本保证。不用担心因为早准备而遗忘的问题,因为每一次看都会比上一次看快很多。随着复习次数增加,对知识点的掌握也会更加牢固。我一些同学到面试前一个月甚至前几天才准备,这时再想准备好庞大的知识点就力不从心了,自然面试结果也不好。因此,一定要尽早开始准备,一定要尽早开始准备,一定要尽早开始准备。我是在面试前半年左右时开始系统地准备,那时其实已经有点晚了。 3.2 形成自己的面试知识体系 面试,

m0_61408386的博客 232

提示工程资源优化的边缘计算:架构师用边缘节点,减少云端资源消耗

通过本文的实践,你已经掌握了用边缘计算优化提示工程资源的完整流程理解了提示工程的资源痛点与边缘计算的适配逻辑;搭建了“边缘-云端协同”的提示工程架构;实现了三大核心优化:边缘缓存、请求分流、轻量模型部署;用监控数据驱动资源迭代,持续优化效果。成果示例云端GPU算力消耗减少45%;请求响应时间从500ms降到150ms;每月算力成本节省约20万元。

大数据洞察的博客 394

架构师必知必会系列:多云架构与混合云

作者:禅与计算机程序设计艺术 1.简介 1.1 概述 混合云是云计算的一个重要模式,它将多个异构的公有云、私有云甚至社区云资源作为一个整体进行管理和使用。随着IT产业的发展,越来越多的公司正在寻求利用混合云这一新型的云平台解决各种IT需求,提升云服务的可靠性、可用

AI天才研究院 1189

阿里P9架构师讲解从单机至亿级流量大型网站系统架构的演进过程

https://www.toutiao.com/a6528694413017743879/?tt_from=mobile_qq&amp;utm_campaign=client_share&amp;timestamp=1520135750&amp;app=news_article&amp;utm_source=mobile_qq&amp;iid=11417535126&amp;utm_medium=...

lppl010_的专栏 3833

Java架构师技术为业务赋能

目录 1 概论 2 天猫的难言之隐 3 如何拆解技术难点-三段论 4 天猫线的破局之道-双引擎回归测试框架 5 架构师的心理游戏-解决问题从转换思维开始 6 技术助力业务的两个方向 7 阿里新零售部门如何培养技术团队的业务知识 8 如何围绕业务特点制定技术发展路线-阿里系和抖音案例 9 阿里系业务的供应链系统-如何评估子类业务的外包与采购

赵广陆 1593

亿级流量系统多级缓存架构10 阿里云实战

亿级流量系统多级缓存架构10 阿里云实战 域名购买解析 域名的价值 域名的价值就像商标一样,体现在你注册一个域名之后,别人就不可以再注册这个域名了,域名的稀缺性就产生了。域名可以买卖,一个域名我注册了,有人也想要的话,我可以选择卖给他。域名没有标准的价格,一般域名越短越好记越有意义,价格越高,但这也不是特别绝对的。 十几年前,互联网还不是很发达,能提供域名注册的商家不多,每年的费用也很高。当然,现在是便宜多了, .com一年大概六七十。 域名可以买卖,当然可以用来赚钱。域名赚钱也不难,买一些域名,有的域名

weixin_42002747的博客 661

3DGS 2025实战指南:从安装到训练全流程解析

本文提供了3D Gaussian Splatting (3DGS) 从零开始的完整实战指南。详细解析了使用gsplat库进行环境配置、依赖安装(包括pycolmap和fused-ssim)、数据准备与COLMAP处理、核心训练流程及参数调优,并探讨了2025年3DGS在动态场景、可控编辑等领域的最新进展,帮助开发者快速掌握这一前沿3D重建技术。

b3n4m5q6w7的博客 359

代码实现ROS2bag录制数据和回放数据(C++)

ROS2的ROS2bag功能可以将指定Topic中的数据以.db3的格式(不同于ROS)保存到本地文件中。读取文件数据可以实现数据回放。

m0_57124501的博客 3256

一天一个大技巧,阿里架构师浅析缓存架构:如何减少不必要的计算?

本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等 众所周知:互联网应用的主要挑战就是在高并发情况下,大量的用户请求到达应用系统服务器,造成了巨大的计算压力。互联网应用的核心解决思路就是采用分布式架构,提供更多的服务器,从而提供更多的计算资源,以应对高并发带来的计算压力及资源消耗。 那么有没有办法减少到达服务器的并发请求压力呢?或者请求到达服务器后,有没有办法减少不必要的计算,降低服务器的计算资源消耗,尽快返回计算结果给用户呢? 有,解决的核心就是缓存。 所谓缓存,就是将需要多次读.

Java_supermanNO1的博客 322

Minio HTTPS证书配置实战:从申请到部署全流程

本文详细介绍了Minio HTTPS证书配置的全流程,从申请到部署,确保对象存储服务的安全性。内容包括证书类型选择、文件处理、服务配置调整及常见问题解决,帮助用户在生产环境中快速实现HTTPS加密传输,提升数据安全。

weixin_42638178的博客 431

阿里云王牌架构师杨曦:也谈系统缓存设计误区及高阶使用技巧

摘要: 相信很多研发同学都有过引入缓存进入到应用架构设计中的经历,本文从几个角度阐述一些选型误区和使用误区以及高阶使用技巧等,供开发者参考。 阿里云高级解决方案架构师 杨旭 世界最大混合云的总架构师,4年前,开始作为双11阿里云技术负责人,负责搭建全球最大的混合云结构,把 “双11”的电商业务和技术场景在阿里云上实现,并保障这个混合云在双11当天能够满足全球客户的购物需求。 正文 相信...

xstardust的博客 256

基恩士数字光纤放大器

在2路输出类型上此为通道开关,并未配备0路类型;设置已搞不清楚不知道怎么办时···完成初始化后,模块重新显示当前值。①无工件时短按[SET]①有工件时短按[SET]各部位的名称和基本操作。可以手动微调设置值。

大小曲奇的博客 1万+

PHP项目实战:易宝支付SDK对接全流程(含回调处理与常见问题排查)

本文详细介绍了PHP项目中易宝支付SDK的对接全流程,包括环境准备、SDK配置、支付请求构建与发起、回调处理实战以及常见问题排查。特别针对回调处理环节的常见问题提供了解决方案,帮助开发者快速完成支付对接并优化性能。

weixin_29007809的博客 388

阿里支付宝架构师:谈谈我眼中的高并发架构。

前言 高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒杀活动,定时领取红包等。 为了让业务可以流畅的运行并且给用户一个好的交互体验,我们需要根据业务场景预估达到的并发量等因素,来设计适合自己业务场景的高并发处理方案。 在电商相关产品开发的这些年,我有幸的遇到了并发下的各种坑,这一路摸爬滚打过来有着不少的血泪史,这里进行的总结,作为自己的归档记录,同时分享给大家。 服务器架构 业务从...

java1856905的博客 1046

从“烧电路”到“软杀伤”:拆解高功率微波(HPM)让无人机失灵的三种物理效应

本文深度解析高功率微波(HPM)如何通过热效应、电磁效应和非线性效应三种物理机制使无人机失灵。从电子元件的热损伤到系统的电磁干扰,再到电路中的非线性破坏,HPM技术为反无人机系统提供了高效的非动能打击手段。文章还探讨了现代无人机的多层级防护策略与应对方案。

weixin_42531886的博客 253

阿里架构师教你微服务化后缓存怎么做

摘要 最近接手的代码中遇到几个缓存的问题,存在一些设计原则的问题,这里总结一下,希望可以对你有帮助 问题 问题1: 店铺数据的获取,将用户关注的数据放在店铺信息一起返回 对外提供的接口 List<Shop> getPageShop(final Query query,final Boolean cache); 返回的店铺信息 当调用方设置cache为true时,因为有缓存的存在...

Java_supermanNO1的博客 281

串口通信的性能瓶颈分析:如何提高数据吞吐量和降低延迟

摘要: 串口通信在高频或大数据场景下存在吞吐量不足、延迟高、丢帧等问题,主要瓶颈包括波特率限制、缓冲区不足、CPU轮询延迟等。优化策略包括:提升波特率至硬件上限、增大缓冲区、采用异步I/O(如ReadAsync)减少线程切换,使用二进制协议降低解析开销。实时性方面需启用硬件流控、批量发送数据,并优化线程优先级。跨平台适配需区分Windows/Linux的缓冲区设置与异步机制。性能测试可通过吞吐量、延迟及回环测试验证优化效果,核心原则是硬件匹配、异步处理、协议优化与跨平台适配。(150字)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 984

华为OD机试双机位C卷-停车场收入统计 (Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷 停车场收入统计,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 停车场收入统计。

qq_45776114的博客 2185

阿里支付宝架构师:谈谈我眼中的高并发架构

(阿里支付宝架构师:谈谈我眼中的高并发架构)[http://www.itpub.net/2019/06/23/2257/] 架构阿里支付宝架构师:谈谈我眼中的高并发架构【好文】 程序员私房菜 2019-06-23 21:56:10 本文共6510个字,预计阅读需要17分钟。 来源:my....

feiying 462

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

架构师必读书籍

1、大型网站技术架构:核心原理与案例分析 本书通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计案例,为读者呈现一幅包括技术选型、架构设计、性能优化、Web安全、系统发布、运维监控等在内的大型网站开发全景视图。 本书作者李智慧,曾在阿里巴巴担任技术专家,参与阿里巴巴基础技术平台开发和架构设计。   2、分布式服务...

changjiang366的博客 9858

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

mybatis一级缓存和二级缓存面试题,Java架构师视频

我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。

q16974058的博客 860

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: Java程序员想要成功面试?请先要弄懂面试过程
下一篇: Facebook架构师的代码审查之道:学习Facebook真正发挥代码审查的提效作用
Java_Cappuccino
博客等级 码龄7年 17粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值