您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

缓存的力量:提升API性能和可扩展性

时间:2023-10-12 11:00:23  来源:51CTO  作者:

译者 | 李睿

审校 | 重楼

缓存是将频繁访问的数据或资源存储在临时存储位置(例如内存或磁盘)的过程,以提高检索速度并减少重复处理的需要。

缓存的力量:提升API性能和可扩展性

缓存的好处

  • 提高性能:缓存消除了每次从原始源检索数据的需要,从而提高了响应时间并减少了延迟。
  • 减少服务器负载:通过提供缓存的内容,减少了服务器上的负载,使其能够处理更多请求,并提高了整体可扩展性。
  • 带宽优化:缓存减少了通过网络传输的数据量,最大限度地减少了带宽的使用,并提高了效率。
  • 增强用户体验:更快的加载时间和响应速度可以带来更好的用户体验,减少用户挫折感,提高用户参与度。
  • 节省成本:缓存可以减少数据处理所需的计算资源,并通过最大限度地减少对昂贵服务器资源的需求来降低基础设施成本。
  • 提高可用性:缓存可以在高流量期间或在服务器临时故障的情况下,通过缓存提供内容来帮助维持服务的可用性。

缓存的类型

(1)客户端缓存

客户端缓存指的是将Web资源(例如html页面、css文件、JAVAScript脚本和图像)存储在用户设备上的过程,通常是在他们的Web浏览器中。客户端缓存的目的是通过减少每次用户访问网页时从Web服务器获取资源的需要来加快网页加载速度。

当用户访问一个网站时,他们的浏览器向Web服务器请求所需的资源。服务器用HTTP标头进行响应,这些标头指导浏览器如何处理缓存。这些标头包括缓存控制(Cache Control)、过期(Expires)、实体标签(ETag)和最后修改时间(Last-Modified)。

浏览器根据服务器提供的缓存规则将资源存储在其缓存中。在对同一页面或资源的后续请求中,浏览器首先检查其缓存。如果基于缓存标头的资源仍然有效,则浏览器会从本地缓存中检索资源,从而节省时间并减少对其他服务器请求的需要。

客户端缓存可以显著提高网站性能,特别是对于返回用户,因为资源可以直接从缓存加载。但是,开发人员需要仔细管理缓存控制标头,以确保用户在需要时接收到更新的内容,并避免过时或过时的缓存资源的潜在问题。

(2)客户端缓存的好处

客户端缓存提供了多种优势,可以增强Web性能和用户体验。首先,它为返回的用户者提供了更快的加载时间,因为资源存储在本地浏览器缓存中,消除了重复服务器请求的需要。这将导致更快的页面加载和更流畅的浏览体验。其次,客户端缓存通过最小化发送到服务器的未更改资源的请求数量来减少服务器负载和带宽消耗。这种优化对高流量网站特别有价值。最后,提高性能可以带来更好的用户体验,减少跳出率,提高用户留存率。通过有效地利用客户端缓存,网站所有者可以提供无缝的浏览体验,优化服务器资源的使用,并实现更好的网站性能。

(3)客户端缓存的工作原理

客户端缓存依赖于HTTP缓存标头,例如Cache-Control、Expires、ETag和Last-Modified,以方便Web浏览器中的资源存储。当用户访问网站时,这些标头决定资源是否可以缓存以及缓存多长时间。浏览器将这些资源存储在本地,并在后续访问时检查缓存的有效性。如果资源仍然有效,浏览器将从缓存中检索它们,从而加快加载时间并减少服务器请求。

如果资源的缓存过期或更改(基于ETag),浏览器将向服务器发送请求。然后,服务器使用带有“If-Modified-Since” 或“If-None-Match”标头的缓存验证来确定资源是否被更新。如果未更改,服务器响应“304未修改”状态,浏览器继续使用缓存版本;否则,它将接收更新的资源以进行缓存。这一过程确保向用户有效地交付内容,同时在需要时维护最新的资源。

客户端缓存的最佳实践

  • 设置适当的缓存控制(Cache-Control)标头:配置其标头来指定资源的缓存规则。使用“public”这样的值来允许浏览器和CDN缓存,“private”这样的值只允许浏览器缓存,或者“no-cache”这样的值来确保资源在每次使用之前都经过服务器的重新验证。
  • 处理动态内容和用户特定数据:在缓存动态内容和用户特定数据时要谨慎。避免缓存显示个性化信息的页面或资源,因为这可能导致向用户提供过时的内容。实现考虑动态内容独特性的缓存策略。
  • 处理资源更新的缓存破坏:在更新资源(如CSS或JavaScript文件)时,实现缓存破坏技术,以确保用户收到最新版本。向资源URL添加版本号或唯一哈希等方法迫使浏览器获取更新的内容,而不是依赖于缓存的版本。

通过遵循这些最佳实践,可以优化客户端缓存,以增强网站性能,减少服务器负载,并提供改进的用户体验。

常见的陷阱和挑战

  • 确保缓存一致性:客户端缓存的挑战之一是维护缓存一致性。当多个用户同时访问相同的资源时,如果缓存版本与最新内容不同,可能会出现差异。必须实现缓存验证机制并设置适当的过期时间,以便在性能和新鲜度之间取得平衡。
  • 处理过期的缓存资源:缓存的资源可能会过期,尤其是在服务器端发生更新时。这可能会导致用户体验到陈旧的内容。实现缓存重新验证方法,例如使用ETag或Last-Modified头的条件请求,在将缓存的资源提供给用户之前检查它们是否仍然有效。
  • 平衡缓存与安全注意事项:在客户端缓存敏感或私有数据可能会带来安全风险。避免缓存敏感信息或在必要时使用适当的加密和身份验证措施。考虑结合使用客户端和服务器端缓存技术,在性能和安全性之间取得平衡。

克服这些缺陷和挑战需要仔细规划和全面的缓存策略。通过处理缓存一致性、处理过时资源和考虑安全影响,用户可以优化客户端缓存,以获得高效和安全的用户体验。

服务器端缓存

服务器端缓存指的是将频繁请求的数据或计算临时存储在服务器内存或存储上的做法。服务器端缓存的主要目标是优化服务器响应时间,减少对冗余处理的需求,从而提高整体系统性能并减少延迟。

(1)缓存机制概述

服务器端缓存使用各种缓存机制来有效地存储和检索数据。一种常见的方法是使用内存缓存,例如redis和Memcached。这些缓存系统直接将数据存储在内存中,从而实现闪电般的访问时间。它们非常适合存储频繁访问的数据,例如数据库查询结果或API响应。通过将数据保存在内存中,服务器端应用程序可以快速检索和提供缓存的内容,从而减少对重复的、昂贵的数据库查询或计算的需求。

另一种缓存机制,特别是针对基于php的Web应用程序,是使用OPcache之类的操作码缓存。操作码缓存将预编译的PHP代码存储在内存中,从而消除了在每次请求时重新处理PHP脚本的需要。这显著地提高了PHP应用程序的性能,因为它绕过了重复的解析和编译步骤,减少了服务器负载和响应时间。

通过利用服务器端缓存机制,例如内存缓存(Redis,Memcached)和操作码缓存(OPcache),应用程序可以优化服务器性能,最小化冗余计算,并为客户端请求提供更快,更有效的响应。这反过来又会带来更好的整体用户体验和响应更快的Web应用程序。

(2)服务器端缓存的好处

服务器端缓存提供了几个关键的好处,可以显著提高Web应用程序的性能和可扩展性:

  • 减少数据库和后端处理负载:通过在内存中缓存频繁请求的数据,服务器端缓存减少了对重复数据库查询和后端处理的需求。减少数据检索和计算量减轻了数据库和服务器负载,从而允许有效地分配资源并提高应用程序的总体响应性。
  • 对于频繁请求的数据,获得更快的响应时间:使用存储在内存缓存中的数据,例如Redis或Memcached,服务器可以在几毫秒内快速检索和提供缓存的内容。因此,对于经常访问的数据,用户可以体验到更快的响应时间,从而增强用户体验并减少等待时间。
  • 可扩展性和负载平衡优势:服务器端缓存在提高Web应用程序的可扩展性和负载平衡能力方面起着至关重要的作用。通过减少后端处理负载,可以快速提供缓存数据,从而允许服务器在不牺牲性能的情况下处理更多数量的并发请求。这使应用程序能够轻松扩展以满足不断增长的需求,确保在流量高峰或高容量使用期间为用户提供无缝体验。

总的来说,服务器端缓存提供了一个健壮的解决方案来增强应用程序性能、优化资源利用和维护响应性,使其成为构建高性能和可扩展Web应用程序的重要组件。

(3)实现服务器端缓存

实现服务器端缓存涉及到各种有效存储和管理缓存数据的策略。一种方法是在应用程序级别缓存数据,使用字典或数组等数据结构将频繁访问的数据直接存储在内存中。这一方法适用于较小规模的缓存或数据不经常更改的情况。然而,在使用这种方法时,考虑内存限制和数据一致性是至关重要的。

另一种有效的技术是缓存数据库查询结果。当执行查询时,其结果存储在缓存中。对同一查询的后续请求可以从缓存中处理,从而减少了数据库的负载并缩短了响应时间。为了使缓存的数据与数据库中的更改保持同步,开发人员需要定义缓存失效策略。

缓存过期和退出策略对于确保缓存数据保持相关性和不消耗过多内存也是必不可少的。缓存过期为缓存的数据设置了一个时间限制,超过该时间限制的数据将被视为过期并在下一次请求时丢弃。另一方面,当缓存达到容量限制时,清除策略决定删除哪些数据。常见的驱逐算法包括最近最少使用(LRU)和最不频繁使用(LFU)。

在实现服务器端缓存时,开发人员需要考虑数据的性质、应用程序的特定需求以及可用的缓存机制,以有效地优化缓存性能。通过组合适当的缓存策略和工具,应用程序可以利用服务器端缓存的优势来提供更快的响应时间、减少数据库负载并实现更有效的数据管理。

(4)优化缓存失效

缓存失效是服务器端缓存的一个关键方面,它可以确保过时的数据不会在缓存中持久存在。实现有效的缓存失效技术对于维护数据准确性和一致性至关重要。删除过时缓存项的一种常用方法是使用过期时间。通过为缓存数据设置适当的过期时间,缓存将自动删除过时的条目,迫使应用程序为下一个请求获取新数据。

另一种强大的缓存失效技术是利用缓存标记和粒度失效。缓存标记允许将多个缓存项与特定标记或标签相关联。当相关数据更新或无效时,缓存可以选择性地删除与该标记关联的所有条目,确保所有受影响的数据都从缓存中删除。

粒度失效允许开发人员针对特定的缓存条目进行删除,而不是清除整个缓存。这种细粒度的方法将不必要地从缓存中删除频繁访问且仍然有效的数据的风险降到最低。通过使用缓存标记和粒度失效,开发人员可以实现对缓存失效更精确的控制,从而实现更有效的缓存管理和改进的数据一致性。

(5)服务器端缓存工具

有几个功能强大的缓存工具和库可用于有效地实现服务器端缓存。Cache类包含在Toro Cloud的Martini中使用缓存的功能。

  • Guava Cache:谷歌公司的Guava Cache是一个缓存工具,它使用仅在内存中的缓存机制。这个提供程序创建的缓存仅对应用程序的单次运行(或者在本例中,对Martini包的单次运行)是本地的。
  • Ehcach:Ehcache是一个全功能的基于Java的缓存提供商。它支持在磁盘或内存中存储数据的缓存。它也是可扩展的,可以针对需要高并发性的负载进行调优。
  • Redis:Redis是一个内存数据结构项目,实现了一个分布式的内存键值数据库,具有可选的持久性。Redis具有内置复制、Lua脚本、LRU驱逐、事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster提供高可用性和自动分区。

通过利用这些缓存工具并将其与Web框架和CMS平台集成,开发人员可以优化服务器响应时间,减少后端处理,并增强其应用程序的整体性能和可扩展性。

(6)缓存功能

企业级集成平台通常配备了缓存功能,以支持动态或静态数据的存储,以便更快地检索。下面是一个示例代码片段,演示了在Martini集成平台中使用缓存功能。

缓存的力量:提升API性能和可扩展性Martini缓存功能的截图

缓存策略和注意事项

在实现缓存策略时,缓存连贯性和一致性是关键的考虑因素。保持缓存连贯性确保缓存的数据与真实源(例如,数据库或后端服务器)中的数据保持连贯。当对源数据进行更新时,缓存的副本应该无效或相应地更新,以防止提供过时的内容。

处理跨不同缓存层的缓存无效可能具有挑战性。这涉及到管理客户端和服务器端的缓存。协调缓存失效以确保跨所有缓存层的一致性需要仔细规划和实现。

通过有效地处理缓存连贯性和处理缓存无效,可以在整个缓存基础设施中维护数据一致性,在优化性能的同时为用户提供最新和准确的内容。

组合缓存方法

实现混合缓存策略涉及利用客户端和服务器端缓存的优势,以最大限度地提高性能和用户体验。

对可以本地存储在用户浏览器中的静态资源利用客户端缓存。设置适当的缓存控制标头来指定缓存持续时间,并优化浏览器缓存的使用,以便在后续访问时更快地加载时间。

为每个请求生成的动态内容使用服务器端缓存。使用内存缓存(例如Redis或Memcached)来存储频繁访问的数据。实现缓存过期和退出策略以保持数据最新。

通过有效地组合这些缓存方法,可以减少服务器负载,最大限度地减少数据传输,并增强应用程序的整体性能和可扩展性,从而在全球范围内提供最佳的用户体验。

原文标题:The Power of Caching: Boosting API Performance and Scalability,作者:Yvonne Parks



Tags:API   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
中国三大运营商共同发布通过GSMA Open Gateway认证的一次性密码 API
3月26日,北京:中国三大领先的移动运营商——中国移动、中国电信和中国联通今日发布商用OTP API(一次性密码API)服务,并通过了GSMA Open Gateway认证。此次发布标志着中...【详细内容】
2024-03-26  Search: API  点击:(18)  评论:(0)  加入收藏
如何免费访问和使用Gemini API?
Gemini是谷歌开发的一个新模型。有了Gemini可以为查询提供图像、音频和文本,获得几乎完美的答案。 我们在本教程中将学习Gemini API以及如何在机器上设置它。我们还将探究各...【详细内容】
2024-02-19  Search: API  点击:(59)  评论:(0)  加入收藏
构建 Web API 的两种流行选择:REST vs GraphQL
在 RESTful 和 GraphQL API 之间的选择取决于您的具体用例。RESTful API 适用于需要高可伸缩性的简单应用程序,而 GraphQL 则适用于具有不同数据需求的复杂应用程序。简介RES...【详细内容】
2024-01-09  Search: API  点击:(63)  评论:(0)  加入收藏
FastAPI:高性能Web框架的简介与应用
正文:在当今互联网时代,构建高性能的WebAPI是许多开发人员的关注重点。而FastAPI作为一个现代、快速的Web框架,为基于标准Python类型提示的API构建提供了强大的支持。FastAPI的...【详细内容】
2023-12-27  Search: API  点击:(101)  评论:(0)  加入收藏
理解 Spark 写入 API 的数据处理能力
这张图解释了 Apache Spark DataFrame 写入 API 的流程。它始于对写入数据的 API 调用,支持的格式包括 CSV、JSON 或 Parquet。流程根据选择的保存模式(追加、覆盖、忽略或报...【详细内容】
2023-12-13  Search: API  点击:(149)  评论:(0)  加入收藏
如何在Python中使用ChatGPT API处理实时数据
译者 | 李睿审校 | 重楼OpenAI公司推出的GPT如今已经成为全球最重要的人工智能工具,并精通基于其训练数据处理查询。但是,它不能回答未知话题的问题,例如: 2021年9月之后的近期...【详细内容】
2023-12-13  Search: API  点击:(227)  评论:(0)  加入收藏
伪原创API是什么?六个角度了解伪原创API
伪原创API,听起来可能对许多人来说是一个陌生的术语。然而,在当今数字化时代,尤其是在内容创作和网络营销领域,伪原创API正逐渐崭露头角。在本文中,我将向您深入介绍伪原创API是...【详细内容】
2023-12-11  Search: API  点击:(156)  评论:(0)  加入收藏
使用FastAPI部署YOLO模型的步骤
在计算机视觉领域,You Only Look Once (YOLO) 算法已经崭露头角,成为一种改变游戏规则的算法。它承诺具有卓越准确性的实时目标检测,使其成为从监视和自动驾驶车辆到图像和视频...【详细内容】
2023-12-06  Search: API  点击:(157)  评论:(0)  加入收藏
构建强大REST API的十个最佳实践
在项目开发中,我们经常会使用REST风格进行API的定义,这篇文章为大家提供10条在使用REST API时的最佳实践。希望能够为你带来灵感和帮助。1、使用具体且有意义的资源名称选择能...【详细内容】
2023-12-06  Search: API  点击:(149)  评论:(0)  加入收藏
前端请求到后端API的中间件流程解析
在前端请求到后端API的典型流程中,经过一系列中间件的处理,确保请求的顺利处理和安全性。以下是中间件的详细解析:1. 前端请求用户在前端发起请求,包括请求的URL、参数、以及其...【详细内容】
2023-12-06  Search: API  点击:(122)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条