HTTP 缓存

一、概述

1.HTTP缓存的基本原理是将Web资源(如HTML,CSS,JavaScript,图片等)保存在客户端或中间代理服务器上,后续的请求可以直接使用客户端或代理服务器上缓存的资源,而不必重新从服务器上获取。

2.HTTP缓存分为强制缓存和协商缓存。

二、强制缓存

1.不需要服务端参与判断是否继续使用缓存,当客户端第一次请求数据时,服务端返回了缓存的过期时间(Expires 与 Cache-Control),没有过期就可以继续使用缓存,否则就需要继续从服务端获取。

2.Expires字段因时区差异、格式限制等原因已逐渐被Cache-Control字段取代。

三、协商缓存

1.需要服务端参与判断是否继续使用缓存,当客户端第一次请求数据时,服务端会将缓存标识(Last-Modified/If-Modified-Since 与ETag/If-None-Match)与数据一起返回给客户端,客户端将两者都备份到缓存中 ,再次请求数据时,客户端将上次备份的缓存标识发送给服务端,服务端根据缓存标识进行判断,如果返回HTTP状态码 304(Not Modified ,请求的资源自上次请求以来没有被修改),则表示客户端可以继续使用缓存。若资源已修改,则返回200状态码和新的资源内容。

2.协商缓存的实现主要通过HTTP请求头中的If-Modified-Since和If-None-Match字段,以及响应头中的Last-Modified(资源的最后修改时间)和ETag(资源的版本标识符)字段来完成。

3.资源更新后,可通过修改资源的URL或更新ETag和Last-Modified头来使缓存失效。

四、HTTP 状态码304的工作流程(资源自上次请求以来没有被修改)

1.初次请求

客户端第一次请求资源时,服务器会返回该资源及其缓存相关信息(如 Last-Modified 头部或 ETag)。

​2. 缓存请求

在后续请求中,客户端会带上之前缓存的相关信息(例如 If-Modified-Since 或 If-None-Match 头),以检查资源是否已被修改。

​3. 服务器响应

服务器检查资源的状态。如果自上次请求以来资源没有被修改,服务器会返回 304 Not Modified 状态码,告诉客户端可以继续使用缓存的资源。

客户端收到 304 响应后,使用缓存中的资源,而不需要从服务器下载。

五、HTTP缓存的优点

1.避免重复资源的下载,减少不必要的网络传输。

2.从缓存中获取内容可以提升页面加载速度。

3.减轻服务器压力。

六、总结

1.强制缓存优先于协商缓存。

2.强制缓存使用的的两个标识:

1)Expires

Expires 的值为服务端资源过期的时间(一个GMT格式的日期时间字符串),即下一次请求时,请求时间小于服务端返回的到期时间,直接使用缓存数据。到期时间是服务端生成的,客户端和服务端的时间可能有差别。

2)Cache-Control

Expires 有个时间校验的问题,所以 HTTP1.1 采用 Cache-Control替代 Expires。

Cache-Control 的取值有以下几种:

private: 客户端可以缓存。响应只能被单个用户缓存,不能被共享缓存存储。

public: 客户端和代理服务器都可缓存。

max-age=xxx: 资源被认为新鲜的最大时间。缓存的内容将在 xxx 秒后失效 。

no-cache: 需要使用协商缓存来验证缓存数据。 缓存内容但立即过期,每次请求都需要与服务器验证缓存的有效性。

no-store: 所有内容都不会缓存,强制缓存和协商缓存都不会被触发。

不允许缓存。

3.HTTP缓存应用在静态资源缓存、动态内容缓存、API接口缓存等场景中。

4.对于频繁更新的资源,应设置较短的缓存时间或采用协商缓存模式。

对于不常更新的资源,应设置较长的缓存时间或采用强制缓存模式。

5.在缓存资源发生变更时,应及时更新缓存信息,以确保客户端获取到最新的资源内容。

6.当资源过期时,客户端会向服务器发送一个验证请求,以检查资源是否发生了变化。

若资源已更改,则服务器返回新的资源,否则客户端继续使用缓存中的副本。

7.使用强制缓存时不会发送请求到服务器,使用协商缓存时会发送请求到服务器以验证资源是否更新。

8.在文件名中包含版本号或哈希值,可防止客户端使用旧版本的缓存文件。

9.敏感数据不应被缓存,或者使用HTTP头no-store来防止缓存。

10.缓存粒度

1)逐资源缓存:每个资源独立缓存。

2)分组缓存:将相关的资源组合在一起进行缓存,如CSS Sprites或JavaScript模块。

11.使用浏览器里的开发者工具可以监控和调试HTTP缓存的行为。


微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

相关推荐
云空2 分钟前
《解锁 Python 数据挖掘的奥秘》
开发语言·python·数据挖掘
青莳吖13 分钟前
Java通过Map实现与SQL中的group by相同的逻辑
java·开发语言·sql
Buleall20 分钟前
期末考学C
java·开发语言
重生之绝世牛码22 分钟前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式
小蜗牛慢慢爬行28 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
MARIN_shen33 分钟前
Marin说PCB之POC电路layout设计仿真案例---06
网络·单片机·嵌入式硬件·硬件工程·pcb工艺
Algorithm157638 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
shinelord明1 小时前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
Monly211 小时前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu1 小时前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa