什么是HTTP缓存?

HTTP缓存指的是缓存HTTP请求和响应内容,以减少网络请求和数据传输的次数,加速网页载入和提高用户体验。缓存可以在客户端浏览器和服务器之间建立,而缓存的机制可以通过HTTP头部来控制。

HTTP缓存机制通常分为两种方式:强缓存和协商缓存。

一、强缓存

强缓存使用“Cache-Control”和“Expires”两个响应头来实现。这两个头部可以让客户端告诉服务器,对于资源的请求,在一段时间内具备“强制缓存”,不需要再向服务器发送请求验证是否有更新,而直接从浏览器缓存中读取资源并加载。

1、Cache-Control响应头

Cache-Control响应头是控制缓存的最重要的响应头之一。它可以设置多个指令,常用指令及其作用如下:

•private:客户端可以缓存该资源,但不能代理缓存;

•public:客户端和代理服务器都可以缓存该资源;

•max-age:资源可以被缓存的最大时间,单位为秒;

•no-cache:需要与服务器验证缓存,但不需要返回新结果;

•no-store:不缓存响应的任何部分。

例如,设置缓存90秒:

Cache-Control: max-age=90

2、Expires响应头

Expires响应头也是控制缓存的响应头之一,但它不能控制缓存过期的精确时间,而只能设置缓存的过期时长,单位是秒。该头部一旦出现,浏览器就会自动在缓存中缓存该资源,直到过期时间到来。

例如,设置过期时间为30秒:

Expires: Wed, 20 May 2021 18:38:57 GMT

二、协商缓存

协商缓存是通过“ETag”和“Last-modified”来实现。当协商缓存生效时,浏览器不是直接从缓存中读取资源,而是向服务器发送请求并带上“ETag”和“Last-modified”两个值,让服务器对比资源的版本是否有更新,如果没有,服务器会返回状态码“304 Not Modified”,告诉浏览器继续使用缓存中的数据。

1、ETag响应头

服务器返回的ETag响应头是根据资源内容生成的唯一标识符,用于标识资源版本,每次更新资源就会生成一个新的ETag值。当浏览器向服务器再次请求同一个资源时,会带上上次返回的ETag值,让服务器对比资源是否有更新。

例如:

ETag: "5bb4-5f5c5b5b5c5c5"

2、Last-Modified响应头

服务器返回的Last-Modified响应头是资源最后一次被修改的时间,当浏览器向服务器再次请求同一个资源时,会带上上次返回的Last-Modified时间戳,让服务器对比资源是否有更新。

例如:

Last-Modified: Mon, 13 Apr 2020 12:43:56 GMT

示例:

以检索数据接口中,对返回结果进行缓存的方式为例:

// 设置缓存90秒
Cache-Control: max-age=90

// 生成ETag值
ETag: "5bb4-5f5c5b5b5c5c5"

// 返回修改时间
Last-Modified: Mon, 13 Apr 2020 12:43:56 GMT

当进行数据检索时,客户端发送请求时会携带上次响应返回的ETag值和Last-Modified时间戳:

If-None-Match: "5bb4-5f5c5b5b5c5c5"
If-Modified-Since: Mon, 13 Apr 2020 12:43:56 GMT

服务器会对比缓存的资源版本和请求中的值,如果资源没有更新,则返回状态码“304 Not Modified”,客户端直接使用缓存中的数据,否则返回新的数据。

以上就是HTTP缓存的详细介绍。缓存是Web性能优化的重要手段,能够大大提高网站的性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:什么是HTTP缓存? - Python技术站

(0)
上一篇 2023年4月28日
下一篇 2023年4月30日

相关文章

  • 什么是HTTP请求超时?

    HTTP请求超时是指在进行HTTP请求时,客户端向服务器发送请求后,等待服务器响应的时间超出了事先设定的设定时间。超时可能是由于网络连接问题、服务器故障、服务器繁忙等原因导致的。 若HTTP请求超时,则客户端会视情况采取相应的策略,比如重试请求、放弃请求等。 以下是两个关于HTTP请求超时的示例说明: 示例一 一个用户想要在网页上下载一个大型文件,然后点击了…

    云计算 2023年4月27日
    00
  • Nginx整合Kafka的方法示例

    Nginx整合Kafka的方法示例 Nginx是一款高性能的Web服务器和反向代理服务器,而Kafka是一款高吞吐量的分布式消息队列。将Nginx与Kafka整合可以实现更高效消息传递处理。以下是Nginx整合Kafka的方法示例的完整攻略: 安装Kafka:首先我们需要安装Kafka。我们可以从Kafka官方网站下载Kafka二进制文件,并按照官方文档进行…

    http 2023年5月13日
    00
  • Tomcat 与 maven 的安装与使用教程

    以下是 Tomcat 与 Maven 的安装与使用教程,以及两条示例说明。 安装 Tomcat 获取安装包并解压: wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.22/bin/apache-tomcat-9.0.22.tar.gz tar -xzvf apache-…

    http 2023年5月13日
    00
  • SpringMail使用过程中的报错解决办法

    当我们在使用SpringMail发送邮件时,有时会遇到一些报错,例如连接超时、认证失败等。以下是解决SpringMail报错的完整略: 检查邮件服务器设置:首先,我们需要检查邮件服务器设置是否正确。我们可以使用以下代码检查邮件服务器是否可: “`java Properties props = new Properties(); props.put(“mai…

    http 2023年5月13日
    00
  • java.net.SocketException: Connection reset 解决方法

    java.net.SocketException: Connection reset是一个常见的Java异常,通常在网络通信过程中出现。这个异常表示连接被重置,可能是由于网络中断、服务器关闭或其他原因导致的。在本文中,我们将提供一些解决这个异常的方法。 解决方法 1. 检查网络连接 首先,我们需要检查网络连接是否正常。如果网络连接不稳定或中断,就会导致连接重…

    http 2023年5月13日
    00
  • HTTP的If-None-Match头部有什么作用?

    HTTP的If-None-Match头部可以用来协助客户端缓存的有效性检查。通常情况下,当客户端请求一个资源,并且该资源已经被缓存,Web服务器会返回状态码为304 Not Modified,表示该资源没有被修改过,客户端可以直接使用它的本地缓存。 If-None-Match头部可以在客户端请求中带上前一次请求中服务器返回的 ETag 值,以此来验证本地缓存…

    Http网络协议 2023年4月20日
    00
  • 解决docker pull镜像报错的问题

    Docker是一款流行的容器化平台,但是在使用Docker时,可能会遇到docker pull镜像报错的问题。以下是解决该问题的攻略,其中包含两个示例: 解决docker pull像报错的问题 在使用 pull命令拉取镜像时,可能会遇到以下报错: Error response from daemon: Get https://registry-.docker…

    http 2023年5月13日
    00
  • JS跨域(Access-Control-Allow-Origin)前后端解决方案详解

    JS跨域(Access-Control-Allow-Origin)前后端解决方案详解 什么是跨域 在Web开发过程中,由于浏览器限制,当协议、主机、域名或端口号任意一个不同时,都会产生跨域问题。 前端解决方案 JSONP JSONP(JSON with Padding)是一种跨域数据访问方案,它通过动态创建<script>标签,然后请求一个带参数…

    http 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部