在现代 Web 应用程序中,RESTful API 是一种非常流行的设计方式。它使得客户端与服务端之间的通信变得更为便捷和高效。在过去的几年中,RESTful API 已经成为前端开发不可或缺的一部分。然而,在某些情况下,RESTful API 可能会遭遇缓慢的响应时间和过多的请求次数。这时,缓存就成为了优化 RESTful API 的必备技能。
缓存的目的
缓存技术是通过将部分数据存储在客户端或服务器的内存中,以避免每次请求时访问数据源,从而优化应用程序的性能。简言之,缓存的目的是减少在服务器请求时需要执行的数据库操作。
RESTful API 的缓存
RESTful API 是一种基于 HTTP 协议的 API,它是无状态的。在 RESTful API 中,客户端通过 HTTP 请求访问服务器资源。由于请求和响应均是通过 HTTP 协议传输的,因此缓存 HTTP 响应是一种优化性能的方式。缓存状态不应与客户端状态关联,因此,缓存不应存储客户端数据,除非数据已被共享。
因此,RESTful API 可以通过将响应的 JSON 数据缓存在浏览器或服务器上,以避免对 API 的重复调用和数据重复传输。这对于频繁使用且数据经常不变的 API 来说尤为重要。
使用 HTTP 缓存
HTTP 规范提供了对响应结果进行缓存的机制。浏览器和服务器都可以使用 HTTP 缓存机制。HTTP 缓存机制可以将响应结果存储在浏览器的缓存中,以便在下一次请求相同的 API 时从缓存中获取数据,而不是再次请求数据。
一个响应的 HTTP Header 包含了多个缓存相关的头部信息。
Cache-Control
Cache-Control
头部指令是控制缓存行为的主要工具之一。它定义了客户端和缓存服务如何处理响应。最常用的缓存指令是 max-age
和 no-cache
。
no-cache
: 客户端和缓存服务都不能缓存该响应结果。no-store
: 不仅不能缓存响应结果,而且还不能存储请求和响应的内容的任何部分。public
: 响应可以被所有人缓存,包括代理服务器。private
: 响应只能被客户端缓存,代理服务器不能缓存。max-age
: 定义响应结果可以被缓存的最大时间。
ETag 和 If-None-Match
ETag
头部是一个由服务器创建的标识响应实体的字符串。当客户端再次请求同一个 URL 时,它在请求头部中发送 If-None-Match
字段,该字段包含了在先前响应中获取的 ETag
值。如果 ETag
值未发生变化,则返回 304 未修改响应,否则返回新的响应结果。
Last-Modified 和 If-Modified-Since
Last-Modified
头部指明了响应结果的最后修改时间。当客户端再次请求相同的 URL 时,它会在请求头部中发送 If-Modified-Since
字段,该字段包含了上次请求时响应的 Last-Modified
值。如果 Last-Modified
值未发生变化,则返回 304 未修改响应,否则返回新的响应结果。
前端缓存的最佳实践
在使用 RESTful API 的过程中,前端缓存可以减少 API 的请求次数,提高应用程序的性能,降低 API 利用率。这里列出的是一些前端缓存最佳实践的建议。
- 缓存数据的时效性应该与数据的稳定性相匹配。
如果 API 端点的数据稳定不变,可以将数据缓存的时效性设置为永久或者很长时间,例如一个星期或者一个月。但是,如果数据可能会更改,缓存的时效性应该和数据的变化频率相匹配。
- 避免缓存敏感数据。
例如,如果 API 返回是网站上的私人信息,如信用卡号、电话号码等,则避免缓存这些敏感信息。
- 考虑不同类型的缓存策略。
适当的缓存策略通常需要考虑多个因素,如时效性,大小,类型等等。例如,长时效性缓存是适用于很少更改的静态数据。而短时效性缓存是适用于基于时钟时间的事件数据,如短信,推特消息等。
- 考虑异步数据的问题。
在应用程序中使用异步请求的情况非常常见。对于已经异步获取数据的应用程序,通常为了防止向 API 发送过多的请求,可以使用缓存来快速获取以前获取的数据。
- 不要使用相同的缓存条目。
当多个不同的页面使用相同的 API 时,应该考虑使用不同的缓存条目,以便在缓存发生故障时只影响一个缓存条目而不是整个应用程序。
使用 JavaScript 缓存 API
除了 HTTP 缓存之外,还有一些其他的缓存技术可以用于优化 RESTful API 性能。
一个可行的技术方案是使用 JavaScript 具有的一些缓存 API,例如 localStorage
和 sessionStorage
。
localStorage
和 sessionStorage
是 HTML5 新增的 JavaScript 接口,它们都提供了在客户端存储数据的一种方法。
区别在于,localStorage
允许数据持久存储并且在客户端之间共享,而 sessionStorage
仅在当前会话中有效,并且不会在不同页面间共享。
下面的示例展示了如何使用 localStorage
缓存和检索数据。
-- ------- ----------------------------------- ----- --- - ------------------------------------ ----- ---------- - -- - -- - ----- -- -- - -- --- ---- - -------------------------------------- -- ----- -- ---------- - --------- - ----------- - ----------------------- - ---- - --------------------- ---------- ---------------- -- ---------------- -------------- -- - --------------------- ---- ---------------- ----- ----------- ----- ------ -- -- --- -
结论
使用缓存是提高 RESTful API 性能的有效方法。缓存为应用程序提供了一种存储和重复使用以前获取的数据的方法。在使用缓存时,应该考虑缓存的时效性,缓存的类型和异步数据问题。同时,HTTP 缓存机制和 JavaScript 缓存 API 都可用于缓存 RESTful API 的响应。虽然缓存是提高应用程序性能的好方法,但是需要谨慎使用,以避免缓存敏感数据或错误的数据。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/672451972e7021665e130818