一、概述
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等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。
欢迎关注。助您在编程路上越走越好!