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

前端:你应该知道的缓存策略

时间:2023-05-04 12:15:18  来源:今日头条  作者:科技狠活与软件技术
缓存是提高我们网络平台性能的关键之一。了解缓存和专注于前端和客户端的特定用例。

缓存是所有工程师都必须知道的非常有用的软件组件。它是一个横向组件,适用于所有技术领域和架构层,如操作系统、数据平台、后端、前端和其他组件。在本文中,我们将描述什么是缓存,并针对前端和客户端解释具体用例。

什么是缓存?

缓存可以以基本方式定义为数据消费者和数据生产者之间的中间存储器,用于存储和提供将被相同/不同消费者多次访问的数据。除了提高性能外,它在用户可用性方面对数据消费者来说是一个透明层。 通常,数据生产者提供的数据的可重用性是利用缓存优势的关键。性能是使用内存数据库等缓存系统来提供具有低延迟、高吞吐量和并发性的高性能解决方案的另一个原因。

例如,每天有多少人查询天气,他们会重复查询多少次?假设纽约有 1,000 人查询天气,其中 50% 的人每天重复相同的查询两次。在这种情况下,如果我们可以将第一个查询存储在尽可能靠近用户设备的位置,我们将获得两个好处:增加用户体验,因为数据提供得更快,并减少对数据生产者/服务器端的查询次数。输出是更好的用户体验和支持更多并发用户使用该平台的解决方案。

天气查询场景

在高层次上,我们可以以互补的方式应用两种缓存策略:

Client/Consumer Side:缓存的数据存储在消费者或用户端,当我们谈论 Web 解决方案时,通常在浏览器的内存中(也称为私有缓存)。

服务器/生产者端:缓存的数据存储在数据生产者架构的组件中。

客户端和服务器端

与任何其他解决方案一样,缓存具有一系列优势,我们将对其进行总结:

  • 应用程序性能:提供更快的响应时间,因为可以更快地提供数据。
  • 减少服务器端的负载:当我们将缓存应用到以前的系统并重用一段数据时,我们正在避免查询/请求到下一层。
  • 可扩展性和成本改进:随着数据缓存越来越接近消费者,我们以更低的成本提高了解决方案的可扩展性和性能。

靠近客户端的组件更具可扩展性和更便宜,因为三个主要原因:

  • 这些组件侧重于性能和可用性,但一致性较差。
  • 他们只有部分信息:用户使用更多的数据。
  • 在浏览器的本地缓存的情况下,数据生产者没有成本。

成本、性能和一致性图

缓存的最大挑战是数据一致性和数据新鲜度, 这意味着数据如何在整个组织内同步和更新。根据用例,我们会有或多或少的要求限制,因为它与缓存图像相比与库存或销售行为有很大不同。

客户端缓存

谈到客户端缓存,我们可以有不同类型的缓存,我们将在本文中稍微分析一下:

  • HTTP 缓存:这种缓存类型是一种中间缓存系统,因为它部分取决于服务器。
  • 缓存 API:这是一个浏览器 API,允许我们在浏览器中缓存请求。
  • 自定义本地缓存: 前端应用控制缓存存储、过期、失效和更新。

缓存

它在浏览器中缓存对任何资源(csshtml、图像、视频等)的 HTTP 请求,并从前端管理所有与存储、过期、验证、获取等相关的内容。应用程序的观点几乎是透明的,因为它以常规方式发出请求并且浏览 器执行所有“魔术”。

缓存

控制缓存的方法是使用 HTTP Headers,在服务器端,它向 HTTP 响应添加特定于缓存的标头,例如:“Expires: Tue, 30 Jul 2023 05:30:22 GMT”,然后是浏览器知道这个资源可以被缓存,下次客户端(应用程序)请求同一个资源时,如果请求时间在过期日期之前,请求将不会完成,浏览器将返回该资源的本地副本。

它允许您设置响应的伪装方式,因为相同的 URL 可以生成不同的响应(并且它们的缓存应该以不同的方式处理)。例如,在返回一些数据的 API 端点中,我们可以使用请求标头来Content-type指定我们是否需要 JSON 或 CSV 等格式的响应。因此,缓存应根据请求标头与响应一起存储。为此,服务器应该设置响应标头Vary: Accept-Language,让浏览器知道缓存取决于该值。有很多不同的标头来控制缓存流和行为,但深入研究它不是本文的目标。它可能会在另一篇文章中解决。

正如我们之前提到的,这种缓存类型需要服务器设置资源过期、验证等。所以这不是一种纯粹的前端缓存方法或类型,但它是缓存前端应用程序使用的资源的最简单方法之一,它是我们将在下面提到的另一种方式的补充。

与这种缓存类型相关,由于它是中间缓存,我们甚至可以将其委托给客户端和服务器之间的“一块”;例如,CDN、反向代理(例如 Varnish)等。

HTTP 缓存的优点和缺点

缓存接口

它与 HTTP 缓存方法非常相似,但在这种情况下,我们控制哪些请求被存储或从缓存中提取。我们必须管理缓存过期(这并不容易,因为这些缓存被认为“永远存在”)。即使这些 API 在窗口上下文中可用,也非常适合它们在 worker 上下文中的使用。

该缓存非常适合用于离线应用程序。在第一次请求时,我们可以获取并缓存它需要的所有资源(图像、CSS、JS 等),从而允许应用程序离线工作。它在移动应用程序中非常有用,例如,除了天气数据之外,我们的 GPS 系统还可以使用地图。这使我们即使没有连接到服务器也能获得远足路线的所有信息。

它如何在窗口上下文中工作的一个示例:

const url = ‘
https://catfact.ninja/breeds’caches.open('v1').then((cache) => {
cache.match((url).then((res) => {
if (res) {
console.log('it is in cache')
console.log(res.json())
} else {
console.log('it is NOT in cache')
fetch(url) .then(res => {
cache.put('test', res.clone())
})
}
})
})

缓存 API 优缺点

自定义本地缓存

在某些情况下,我们 需要更多地控制缓存数据和失效(不仅仅是过期)。缓存失效不仅仅是检查max-age缓存条目。

想象一下我们上面提到的天气应用程序。该应用程序允许用户更新天气以反映某个地方的真实天气。该应用程序需要针对每个城市执行请求并将温度值从华氏度转换为摄氏度(这是一个简单的示例:在其他用例中计算成本可能更高)。

自定义本地缓存

为了避免向服务器做请求(即使它被缓存),我们可以一次做所有的请求,把所有的数据放在一个我们方便的数据结构中,并存储在,例如在浏览器的IndexedDB中,在LocalStorage、SessionStorage 甚至在内存中(不推荐)。下次我们要显示数据时,我们可以从缓存中获取它,而不仅仅是资源数据(甚至是我们所做的计算),节省网络和计算时间。

我们可以通过在API后面加上发布时间来控制缓存的过期,也可以控制缓存的失效。现在想象一下,用户在其浏览器中添加了一只新猫。我们可以让缓存失效,下次再做请求和计算,或者更进一步,用新数据更新我们的本地缓存。或者,另一个用户可以更改该值,服务器将发送一个事件以将更改通知给所有客户端。例如,使用WebSockets,我们的前端应用程序可以听到这些事件并使缓存无效或只更新缓存。

客户到供应商系统

这种缓存需要我们这边的工作来检查缓存并处理可能使其失效或更新的事件等,但非常适合六边形架构,其中使用端口适配器(存储库)从 API 使用数据可以听到域事件以对更改做出反应并使某些缓存无效或更新。

自定义本地缓存优缺点

这不是缓存通用解决方案。我们需要考虑它是否适合我们的用例,因为它需要在前端应用程序端工作以使缓存无效或发出和处理数据更改事件。在大多数情况下,HTTP 缓存就足够了。

结论

拥有缓存解决方案和良好的策略应该是任何软件架构中必须的, 但我们的解决方案将是不完整的,并且可能没有优化。 缓存是我们最好的朋友,主要是在高性能场景中。看起来技术失效缓存过程是挑战,但 最大的挑战是了解业务场景和用例,以确定在数据新鲜度和一致性方面的要求,使我们能够设计和选择最佳策略。



Tags:缓存   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Redis与缓存一致性问题
缓存一致性问题是在使用缓存系统,如Redis时经常遇到的问题。当数据在原始数据源(如数据库)中发生变化时,如何确保缓存中的数据与数据源保持一致,是开发者需要关注的关键问题。一...【详细内容】
2024-04-11  Search: 缓存  点击:(2)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13  Search: 缓存  点击:(6)  评论:(0)  加入收藏
让数据库和缓存数据保持一致的三种策略
如何保证缓存和数据库的一致性,这算得上是个老生常谈的话题啦,看到好多技术新人在写更新缓存数据代码,采用了非常复杂甚至“诡异”的方案,甚为不解。一、背景目前随着缓存架构方...【详细内容】
2024-02-20  Search: 缓存  点击:(37)  评论:(0)  加入收藏
Java中的缓存技术及其使用场景
Java中的缓存技术是一种优化手段,用于提高应用程序的性能和响应速度。缓存技术通过将计算结果或者经常访问的数据存储在快速访问的存储介质中,以便下次需要时可以更快地获取。...【详细内容】
2024-01-30  Search: 缓存  点击:(72)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19  Search: 缓存  点击:(86)  评论:(0)  加入收藏
苹果Safari浏览器如何快速清理缓存?只需简单两步,轻松解决!
Safari是一款由苹果公司开发的多功能浏览器,以其快速、稳定和安全而受到用户的青睐。在我们使用Safari时,它会产生大量的缓存文件。这些缓存文件会占用存储空间,影响设备的运行...【详细内容】
2024-01-17  Search: 缓存  点击:(81)  评论:(0)  加入收藏
并发环境下,先操作数据库还是先操作缓存?
大家好,我是田螺。在分布式系统中,缓存和数据库同时存在时,如果有写操作的时候,先操作数据库还是先操作缓存呢?先思考一下,可能会存在哪些问题,再往下看。下面我分几种方案阐述。...【详细内容】
2023-12-27  Search: 缓存  点击:(105)  评论:(0)  加入收藏
JavaScript的作用域、闭包、高阶函数、柯里化、函数缓存和纯函数
作用域就是当前执行环境的上下文,它限制了变量、函数的有效范围。在当前作用域下声明的变量、函数只能在当前作用域内以及它嵌套的子作用域内有效。这样避免变量和函数的命名...【详细内容】
2023-12-15  Search: 缓存  点击:(138)  评论:(0)  加入收藏
Redis 除了用作缓存还能干吗?
今天我们来聊聊 Redis 的使用案例。Redis 是一种内存键值数据库。它支持多种数据结构,如 String, Hash, List, Set 和 SortedSet。图片01 缓存Redis 的最常用的用例是缓存,以...【详细内容】
2023-12-11  Search: 缓存  点击:(119)  评论:(0)  加入收藏
互联网大厂是如何设计和使用缓存的?方案已开源!
最近,有小伙伴私信我:冰哥,我最近出去面试,面试官问我如何设计缓存能让系统在百万级别流量下仍能平稳运行,我当时没回答上来。接着,面试官问我之前的项目是怎么使用缓存的,我说只是...【详细内容】
2023-12-11  Search: 缓存  点击:(144)  评论:(0)  加入收藏
▌简易百科推荐
20k级别前端是怎么使用LocalStorage的,想知道吗?
当咱们把咱们想缓存的东西,存在localStorage、sessionStorage中,在开发过程中,确实有利于咱们的开发,咱们想看的时候也是一目了然,点击Application就可以看到。前言大家好,我是林...【详细内容】
2024-03-26  前端之神  微信公众号  Tags:前端   点击:(12)  评论:(0)  加入收藏
前端不存在了?盲测64%的人更喜欢GPT-4V的设计,杨笛一等团队新作
3 月 9 日央视的一档节目上,百度创始人、董事长兼 CEO 李彦宏指出,以后不会存在「程序员」这种职业了,因为只要会说话,人人都会具备程序员的能力。「未来的编程语言只会剩下两种...【详细内容】
2024-03-11  机器之心Pro    Tags:前端   点击:(9)  评论:(0)  加入收藏
前端开始“锈化”?Vue团队开源JS打包工具:基于Rust、速度极快、尤雨溪主导
Vue 团队已正式开源Rolldown —— 基于 Rust 的 JavaScrip 打包工具。Rolldown 是使用 Rust 开发的 Rollup 替代品,它提供与 Rollup 兼容的应用程序接口和插件接口...【详细内容】
2024-03-09  OSC开源社区    Tags:Vue   点击:(11)  评论:(0)  加入收藏
两年前端经验还不会手写Promise?
什么是promise?当我们处理异步操作时,我们经常需要进行一系列的操作,如请求数据、处理数据、渲染UI等。在过去,这些操作通常通过回调函数来处理,但是回调函数嵌套过多会导致代码...【详细内容】
2024-03-07  海燕技术栈  微信公众号  Tags:Promise   点击:(23)  评论:(0)  加入收藏
网站开发中的前端和后端开发有什么区别
前端开发和后端开发都是干什么的?有哪些区别?通俗地讲,前端干的工作是用户可以直接看得见的,而后端开发的工作主要在服务端,用户不太能直接看到。虽然前端开发和后端开发的工作有...【详细内容】
2024-02-21  CarryData    Tags:前端   点击:(32)  评论:(0)  加入收藏
网站程序开发中的前后端分离技术
随着互联网的快速发展和技术的不断创新,传统的网站开发模式已经难以满足日益增长的业务需求。为了提高开发效率、增强系统的可维护性和可扩展性,前后端分离技术逐渐成为了网站...【详细内容】
2024-01-31  网站建设派迪星航    Tags:前后端分离   点击:(23)  评论:(0)  加入收藏
如何优雅的实现前端国际化?
JavaScript 中每个常见问题都有许多成熟的解决方案。当然,国际化 (i18n) 也不例外,有很多成熟的 JavaScript i18n 库可供选择,下面就来分享一些热门的前端国际化库!i18nexti18ne...【详细内容】
2024-01-17  前端充电宝  微信公众号  Tags:前端   点击:(69)  评论:(0)  加入收藏
Vue中Scope是怎么做样式隔离的?
scope样式隔离在 Vue 中,样式隔离是通过 scoped 特性实现的。当在一个组件的 <style> 标签上添加 scoped 特性时,Vue 会自动为这个样式块中的所有选择器添加一个唯一的属性,以...【详细内容】
2024-01-04  海燕技术栈  微信公众号  Tags:Vue   点击:(80)  评论:(0)  加入收藏
vue3中 ref和 reactive的区别 ?
最近有朋友在面试过程中经常被问到这么一个问题,vue3 中的ref 和 reactive的区别在哪里,为什么 要定义两个API 一个 api不能实现 响应式更新吗??带着这个疑问 ,我们 接下来进行逐...【详细内容】
2024-01-03  互联网高级架构师  今日头条  Tags:vue3   点击:(38)  评论:(0)  加入收藏
React18 与 Vue3 全方面对比
1. 编程风格 & 视图风格1.1 编程风格 React 语法少、难度大;Vue 语法多,难度小例如指令:Vue<input v-model="username"/><ul> <li v-for="(item,index) in list" :key="inde...【详细内容】
2024-01-03  爱做梦的程序员  今日头条  Tags:Vue3   点击:(72)  评论:(0)  加入收藏
站内最新
站内热门
站内头条