RESTful API 的缓存最佳实践

在现代 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-ageno-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 利用率。这里列出的是一些前端缓存最佳实践的建议。

  1. 缓存数据的时效性应该与数据的稳定性相匹配。

如果 API 端点的数据稳定不变,可以将数据缓存的时效性设置为永久或者很长时间,例如一个星期或者一个月。但是,如果数据可能会更改,缓存的时效性应该和数据的变化频率相匹配。

  1. 避免缓存敏感数据。

例如,如果 API 返回是网站上的私人信息,如信用卡号、电话号码等,则避免缓存这些敏感信息。

  1. 考虑不同类型的缓存策略。

适当的缓存策略通常需要考虑多个因素,如时效性,大小,类型等等。例如,长时效性缓存是适用于很少更改的静态数据。而短时效性缓存是适用于基于时钟时间的事件数据,如短信,推特消息等。

  1. 考虑异步数据的问题。

在应用程序中使用异步请求的情况非常常见。对于已经异步获取数据的应用程序,通常为了防止向 API 发送过多的请求,可以使用缓存来快速获取以前获取的数据。

  1. 不要使用相同的缓存条目。

当多个不同的页面使用相同的 API 时,应该考虑使用不同的缓存条目,以便在缓存发生故障时只影响一个缓存条目而不是整个应用程序。

使用 JavaScript 缓存 API

除了 HTTP 缓存之外,还有一些其他的缓存技术可以用于优化 RESTful API 性能。

一个可行的技术方案是使用 JavaScript 具有的一些缓存 API,例如 localStoragesessionStorage

localStoragesessionStorage 是 HTML5 新增的 JavaScript 接口,它们都提供了在客户端存储数据的一种方法。

区别在于,localStorage 允许数据持久存储并且在客户端之间共享,而 sessionStorage 仅在当前会话中有效,并且不会在不同页面间共享。

下面的示例展示了如何使用 localStorage 缓存和检索数据。

-- ------- -----------------------------------
----- --- - ------------------------------------
----- ---------- - -- - -- - ----- -- -- - --

--- ---- - --------------------------------------

-- ----- -- ---------- - --------- - ----------- -
  -----------------------
- ---- -
  ---------------------

  ----------
    ---------------- -- ----------------
    -------------- -- -
      ---------------------
        ----
        ---------------- ----- ----------- ----- ------ --
      --
    ---
-

结论

使用缓存是提高 RESTful API 性能的有效方法。缓存为应用程序提供了一种存储和重复使用以前获取的数据的方法。在使用缓存时,应该考虑缓存的时效性,缓存的类型和异步数据问题。同时,HTTP 缓存机制和 JavaScript 缓存 API 都可用于缓存 RESTful API 的响应。虽然缓存是提高应用程序性能的好方法,但是需要谨慎使用,以避免缓存敏感数据或错误的数据。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/672451972e7021665e130818