http缓存协议详细介绍

摘要

本文将深入探讨HTTP缓存协议的基本原理、缓存策略以及来自服务器和客户端的缓存指令。我们将详细解析缓存标志和相关头部字段,以帮助开发人员更好地理解和应用HTTP缓存机制。

1. 缓存的基本原理

HTTP缓存是一种机制,用于在客户端和服务器之间存储已请求资源的副本。当客户端再次请求相同资源时,可以直接从缓存中获取,而无需再次向服务器发送请求。这样可以减少网络流量、提高性能和用户体验,极大的降低了服务器的处理压力。

HTTP缓存的基本原理如下:

  • 客户端发送请求到服务器,并在响应中获取资源。
  • 服务器在响应中发送与资源相关的头部字段,用于控制资源的缓存行为。
  • 客户端根据这些头部字段来决定是否将资源保存到缓存中。
  • 当客户端再次请求相同资源时,会先检查是否存在有效的缓存副本。如果存在,则直接从缓存中获取资源。

2. 缓存策略

这里就设计到一个缓存策略的问题,这些问题包括:

  • 哪些资源需要加入到缓存,哪些不需要?
  • 缓存的时间是多久呢?
  • 如果服务器的资源有改动,客户端如何更新缓存呢?
  • 如果缓存过期了,可是服务器上的资源并没有发生变动,又该如何处理呢?
  • .......

为了有效利用HTTP缓存,需要制定适当的缓存策略。以下是常见的缓存策略:

  • 强制缓存:当资源被强制缓存在客户端时,下一次请求时将直接从客户端获取,而不发送请求到服务器。这是通过设置响应头部字段来实现的。
  • 协商缓存:当资源未被强制缓存在客户端时,客户端发送请求到服务器,并根据服务器返回的响应判断是否使用已有的副本。这是通过与服务器进行协商来实现的。

3. 来自服务器的缓存指令

服务器可以通过响应头部字段发送缓存指令,以指示客户端如何缓存资源。以下是常见的服务器缓存指令:

  • Cache-Control:这是最常用的服务器缓存指令,用于控制资源的缓存行为。常见的Cache-Control指令包括:

    • max-age:指定资源在客户端缓存中的有效期(以秒为单位)。例如,max-age=3600表示资源在客户端缓存有效期为3600秒。
    • no-cache:表示客户端不能直接使用已有的副本,需要先与服务器进行验证。
    • no-store:表示响应不能被任何形式的缓存进行保存,每次请求都需要从服务器获取最新版本。
  • ETag:ETag是服务器为每个资源分配的唯一标识符。它可以是资源内容的哈希值、版本号或任何其他能够唯一标识资源的字符串。当客户端再次请求资源时,可以将上次获取资源时服务器返回的ETag值发送给服务器,以便服务器判断资源是否发生了变化。如果ETag值匹配,服务器可以返回304 Not Modified,客户端可以直接从缓存中获取资源。

  • Date:Date是响应头部字段,表示响应生成的日期和时间。它通常由服务器自动生成,并用于协助缓存控制和验证机制。当客户端发送请求时,会将上次获取资源时服务器返回的Date值发送给服务器。这有助于服务器判断客户端请求是否在资源过期之前发出。 这些缓存指令和头部字段在HTTP协议中起着关键作用,帮助服务器和客户端进行缓存控制、协商和验证。

  • Last-Modified:Last-Modified是响应头部字段,表示资源的最后修改时间。服务器在响应中发送该字段,以便客户端在下一次请求时将该值发送回服务器进行协商缓存。当客户端再次请求资源时,可以将上次获取资源时服务器返回的Last-Modified值发送给服务器。如果资源在该时间之后未发生修改,服务器会返回304 Not Modified,客户端可以直接从缓存中获取资源。 这个字段用于协商缓存机制,通过比较资源的最后修改时间来判断是否需要重新获取资源。

  • Expires

    http1.0版本中,是通过Expires响应头来指定过期时间点的,例如:

    bash 复制代码
    Expires: Thu, 23 Apr 2023 22:08:38 GMT

    到了http1.1版本,已更改为通过Cache-Controlmax-age来记录了。

4. 客户端的缓存指令

客户端可以通过请求头部字段发送缓存指令,以告知服务器其拥有的资源副本情况。以下是常见的客户端缓存指令:

  • If-Modified-Since:用于协商缓存,客户端将上次获取资源时的Last-Modified值发送给服务器。服务器会比较资源的最后修改时间,如果未发生变化,则返回304 Not Modified,客户端可以直接从缓存中获取资源。
  • If-None-Match:用于协商缓存,客户端将上次获取资源时的ETag值发送给服务器。服务器会比较资源的ETag值,如果匹配,则返回304 Not Modified,客户端可以直接从缓存中获取资源。

如何判断缓存是否有效呢?

缓存有效

就是把max-age + Date,得到一个过期时间,看看这个过期时间是否大于当前时间,如果是,则表示缓存还没有过期,仍然有效,如果不是,则表示缓存失效。

当浏览器发现缓存有效时,完全不会请求服务器,直接使用缓存即可得到结果 此时,如果你断开网络,会发现资源仍然可用 这种情况会极大的降低服务器压力,但当服务器更改了资源后,浏览器是不知道的,只要缓存有效,它就会直接使用缓存

缓存无效

当浏览器发现缓存已经过期,它并不会简单的把缓存删除,而是问问服务器,我这个缓存还能继续使用吗? 于是,浏览器向服务器发出了一个带缓存的请求,又称之为协商缓存

带缓存的请求则是加上If-Modified-SinceIf-None-Match的请求头。

服务器可能会产生两个情况:

  • 缓存已经失效 (200)
  • 缓存仍然有效(304)

5. 缓存标志

HTTP协议中使用一些标志来表示资源是否被缓存或如何进行缓存。以下是常见的缓存标志:

  • Public:表示响应可以被任何中间代理服务器(如CDN)和客户端进行缓存。
  • Private:表示响应只能被特定用户代理(如浏览器)进行缓存。
  • No-Cache:表示响应不能被直接使用,需要先与服务器进行验证。
  • No-Store:表示响应不能被任何形式的缓存进行保存。

结论

HTTP缓存协议是提高性能和用户体验的重要机制。通过理解缓存的基本原理、制定适当的缓存策略以及使用服务器和客户端的缓存指令,开发人员可以更好地利用HTTP缓存机制。同时,了解和使用缓存标志可以更精确地控制资源的缓存行为。通过合理应用HTTP缓存协议,我们可以减少网络流量、提高性能,并提供更好的用户体验。

相关推荐
Myli_ing22 分钟前
考研倒计时-配色+1
前端·javascript·考研
余道各努力,千里自同风25 分钟前
前端 vue 如何区分开发环境
前端·javascript·vue.js
软件小伟34 分钟前
Vue3+element-plus 实现中英文切换(Vue-i18n组件的使用)
前端·javascript·vue.js
醉の虾1 小时前
Vue3 使用v-for 渲染列表数据后更新
前端·javascript·vue.js
张小小大智慧1 小时前
TypeScript 的发展与基本语法
前端·javascript·typescript
hummhumm1 小时前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j
asleep7011 小时前
第8章利用CSS制作导航菜单
前端·css
hummhumm1 小时前
第 28 章 - Go语言 Web 开发入门
java·开发语言·前端·python·sql·golang·前端框架
幼儿园的小霸王2 小时前
通过socket设置版本更新提示
前端·vue.js·webpack·typescript·前端框架·anti-design-vue
疯狂的沙粒2 小时前
对 TypeScript 中高级类型的理解?应该在哪些方面可以更好的使用!
前端·javascript·typescript