http缓存

什么是缓存
缓存是指对存储资源的一份拷贝,下次请求资源的时候即可使用这一份拷贝。当web缓存发现请求的资源已经被存储,会拦截请求,返回该资源的拷贝,而不会去we服务器重新下载。
为什么需要缓存
1、减少带宽
2、缓解服务器压力
3、提升网站的性能(*):可以减少用户等待的时间,可以使得网站的性能上升,给用户更好的体验。

HTTP1.0时代
主要通过使用Pragma和Expires两个字段来规范。(可以直接写在页面的meta标签中)

1、Pragma
在响应头里面设置这个字段是no-cache的时候,意味着浏览器不会缓存资源,每次都会向服务器发送一个请求。

2、Expires
用来设置缓存的时间,是一个格林尼治时间,告诉浏览器资源过期的时间点,如果还没过该时间点就不会发送请求。

当Pragma与Expires同时出现的时候,起作用的是Pragma。即当设置了Pragma为no-cache的时候,即使设置了Expires也会发送请求。

使用这两个字段存在的问题,Expires定义的缓存时间是相对服务器而言的,如果客户端的时间与服务端时间不一致,那就没什么用了。因为这些问题,引来了HTTP1.1的缓存机制。

HTTP1.1

1、Cache-Control
若报文中同时出现了Expires和Cache-Control则以Cache-Control为主,如果出现了Pragma,则优先级为:
Pragma > Cache-Control > Expires

这个字段的值可以进行一些组合:

完全不缓存

Cache-Control: no-cache,no-store, must-revalidate

缓存过期
max-age与Expores对应,Expires是一个时间点,需要与服务器时间同步,而max-age是一个时间段,并且可以针对一些长时间不会改变的文件设置一定的时长以保证缓存有效。

Cache-Controlmax-age = 3600

这里的缓存的有效期是一个小时。

到这里,决定客户端是否发送请求已经讲完了,现在有一个重要的问题,那就是客户端发送请求之后,服务端就必须要将全部的资源发回去,如果客户端发送了请求,服务端资源并没有改变呢?

2、Last-Modified
服务器将资源传递给客户端的时候,会将资源最后的修改时间以“Last-Modified: GTM”的形式加在实体首部一起返回给客户端。

Last-Modified :... GTM

这个时候客户端请求资源的时候需要发送一个字段来标记时间,服务器会根据这个字段与服务器上该资源的最终修改时间对比,若一致说明该资源没有被修改过.
客户端发送的字段一般有两种:

If-Modified-Since:Last-Modified-value

该字段告诉服务器如果客户端传来的最后修改时间与服务器上时间一致,直接返回304状态吗即可,当前各大浏览器都是使用该字段来向服务器传递保存的Last-Modefied的值。如果时间不一致,服务器就会返回所有的这个资源并返回200状态吗。

If-Unmodified-Since:Last-Modified-value

该字段告诉服务器如果客户端传过来的时间与服务器上的时间不一致,直接返回412状态码(Precondition Failed)。

3、Etag
使用Last-Modified存在一些问题:

  1. 首先,一些文件可能会周期性修改,但是内容并不修改(仅仅修改改变的修改时间),这个时候我们不希望客户端认为这个文件被修改过了,而重新GET;
  2. 某些文件修改频繁,比如在秒以下的时间内进行修改,Last-Modified能检查的粒度是s级的。
  3. 某些服务器不能精确的得到文件的最后修改时间

为了解决这些问题,于是又添加了Etag字段来标识资源的唯一性。
服务端返回的实体里面定义一个字段Etag,这个字段的值是由某种算法计算出的唯一标识符(比如md5)

客户端在请求资源的时候发送一个字段吧服务器给的这个Etag值再传给服务器,服务器会根据这个只和自己这个资源的Etag值进行对比,如果不同的话就返回200,如果相同的话只需要返回304告诉浏览器直接从缓存中读取就可以了。

客户端发送的这个字段也有两种:

If-Node-Match:Etag-value

告诉服务器如果Etag没有匹配上则需要重新发送的资源,否则直接返回304和响应报头就行。当前浏览器均是使用该请求来向服务端传递保存的Etag值。

If-Match:Etag-value

该字段告诉服务器如果客户端传来的Etag值跟服务器上的不一致,直接返回412

Last-Modified和Etag可以一起使用,服务器会优先检验Etag值,一致的情况下才会继续比对Last-Modified,最后决定是返回资源还是返回304.

浏览器到底怎么判断缓存

1、强缓存
强缓存就是Pragma、Expires、CacheControl,命中强缓存后状态码会返回200,后面会跟上from cache。当然,现在高版本的chrome换成了from disk cache(磁盘缓存)和from memory cache (内存缓存)。

2、协商缓存
协商缓存就是Last-Modified/If-Modified-Since或者Etag/If-None-Match,命中协商缓存后状态码304.

3、判别规则

  1. 浏览器首先根据资源头部判断是否命中强缓存,如果命中就直接从缓存加载资源,不会再发送请求
  2. 如果命中强缓存,就会发一个请求到服务器端,服务器根据这个头部里面的If-Modified-Since或者If-None-Match来判断是否命中协商缓存,如果命中就返回304,浏览器就会直接从缓存中拿资源。
  3. 如果协商缓存也没有命中,就会直接返回新的资源,并返回状态码200.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值