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

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

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值