HTTP 控制缓存

  • 一、HTTP请求和响应结构简图

1. 请求
一般分为三部分:请求行、请求头和请求体,但是要注意请求头和请求体之间的空行也是HTTP请求规范内容。请求行分为三部分,方法、资源路径和协议版本。

2. 响应

通常也分为三部分:响应行、响应头和响应体,响应头和响应体直接的空行也是HTTP的规范。响应行也分为三部分,协议版本,状态码和状态码描述。

二、再验证和新鲜度检测

web缓存可以自动保存常见文档副本,当web请求抵达时,如果本地有“已缓存”的副本,则【可以】(可以,意味着并不是一定都会从缓存中获取资源,这和再验证、新鲜度有关)直接从缓存读取,而不是从原始的服务器中查找资源。

新鲜度:【缓存】会将服务器响应的资源缓存一段时间,在这段时间内都认为该资源是“新鲜”的,当有新的请求需要该资源时,缓存在可以不访问原始服务器的情况下直接提供该资源。(目前web缓存存在多级缓存结构,不只是浏览器会有本地私有缓存,类似CDN服务器等也会有公共代理缓存)

再验证:当缓存一个副本的时间超过了新鲜度限值,就认为该对象过时了,当新的请求访问该资源时,缓存需要再次和服务器进行确认,查看该文档是否被修改产生了变化,如果无变化,则更新新鲜度值,从缓存中返回该资源。

三、过程

1. 缓存接收请求

2. 缓存解析请求:对请求报文进行解析,提取URL和各种首部

3. 查询:缓存查询是否有本地缓存,如果没有,则请求原始服务器,从响应中保存一份副本,返回200的状态码和last-modified:Date的响应头(表示该资源最近修改的时间)

4. 新鲜度检测:如果有缓存,则进行新鲜度检测,如果副本没有过期,则返回缓存副本;如果副本过期,则进行【再验证】询问服务器该资源是否过期,通过HTTP请求头if-modified-since携带文档的修改日期到服务器,服务器会进行比对,如果资源没被修改,则返回304(not modified),由缓存直接响应请求;如果资源被修改过了,则由服务器返回相应,响应码200,接着缓存考本新的资源覆盖旧的资源,返回客户端响应资源

5. 创建响应:调整服务器端的的响应以匹配客户端,例如客户端是HTTP1.0的协议,服务器端的是HTTP1.1的协议,则缓存可以做一些调整使两者匹配

6. 发送响应

7. 记录日志


四、HTTP协议中的控制缓存

通过响应来控制缓存,在响应头中主要有cache-control、pragma、expires三个响应头,其中expires是HTTP1.0中的响应头,后面直接跟一个缓存失效日期,但是服务器和客户端之间的时钟往往不同,因此通过该响应头来控制缓存失效时间不准确,一般不用,如果要设置客户端不缓存,则设置响应头“expires: -1”即可;pragema是HTTP1.1协议为了兼容HTTP1.0+协议,用来控制不缓存,“pragma: no-cache";cache-control是HTTP1.1中的响应头,其参数为相对的秒值,即过多少秒缓存失效,因此建议使用该响应头来控制缓存失效时间,其后可以跟的内容有no-cache、no-store、max-age、must-revalidate

为了兼容各个协议版本,要想客户端不缓存资源,一般都添加三个响应头:cache-control: no-cache、pragma: no-cache、expires: -1

注意:cache-control: no-cache控制缓存,客户端是会缓存资源的,只是在于原始服务器进行再验证之前不会想客户端提供资源,也就是资源新鲜度永远过期,这样比直接访问服务器节省了资源在网络中的传输成本,相比开启缓存增加了再验证的成本,性能失效介于两者之间;要想客户端缓存不从响应中拷贝资源副本,则应该使用cache-control: no-store,使用该响应头内容也可以让缓存立即删除已经拷贝的副本;而must-revalidate是服务器希望缓存能严格遵守过期信息,一般情况下类似no-cache,但在缓存与原始服务器进行新鲜度验证的时候,原始服务器不可用,这将会导致这一段时间中访问该资源会504 gateway timeout,因此建议使用no-cache


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值