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技术站