缓存

缓存:

      要建立一种自动化的,基于客户端和浏览器端协商的的这么一种缓存机制。这种缓存机制呢就是以 http header来进行一个传输的。

      通过http header 上的一些属性呢,能够去配置这样的一个缓存策略。这也是我们客户端和浏览器端通讯的一种方式。用过http header来传递信息。

      控制缓存策略的http header:

一、Cache-control

      1:max-age: 指定缓存的最大有效时间。

      设置了这个属性之后呢,表示,在这段时间之内,从请求这个资源到

这段时间之内,我的浏览器再次请求这个资源的时候,是不会向服务端发起请求的。

缓存

max-age会让客户端在请求资源的时候,不去向服务端发起请求。因为它知道,在max-age 这段时间内,这个资源都是有效的,不会过期的。

      那么这段时间内,客户端可以从缓存中请求资源。

缓存

以上有个属性叫做expires:过期时间。 max-age 的优先级是高于expires的。

 

 

      2:s-maxage:也是指定缓存的有效时间。但是它只能指定那种public类型的缓存。它的优先级是高于max-age的。

      缓存

设置了s-maxage属性,请求返回的状态是304。

Public 和 private:

      我们的缓存设备有很多。不仅仅我们的浏览器是一种缓存设备,对于我们整个网络来说,我们还有可能在我们浏览器中间有我们的代理服务器,它也是可能作为我们的缓存设备。比如说我们的cdn。那么对于这样的缓存设备的话,它分两种情况,一种是我们的private的这么一种缓存设备。

所以当这个资源呢,它是被设置了s-maxage 的。它实际上是要去public的这么一个缓存区域是读相关的缓存信息。如果它的缓存没有过有效时间的话,它这个信息就不是去我的浏览器去拿了,而是要去cdn上拿。cdn就是我们public的缓存设备。所以它一个请求会发到我们的cdn上去。然后返回相关的一个304的状态以及我们相关的缓存的这么一个文件信息。如果超过了这么s-maxage设置的这么一个过期时间,那么cdn才会去相应的源服务器去更新这个文件。

      3:private

private:就是私人的缓存设备。只能是你用户当前所缓存的缓存,比如用户在客户端在浏览器所缓存的缓存信息。只有访问这个用户的浏览器才能使用。

 

      4:public

public:public的缓存设备呢,比如说我们的cdn。因为它是很多用户访问并且是读取信息的。

 

      5:no-cache

缓存

No-cache 的意思是 我当前的这么一个文件,我们不管怎么样,我们都会向浏览器发起请求,浏览器那边去询问,当前我的这个文件有没有在我的缓存策略里过期。而不是说直接不发请求像max-age一样,直接去存读。

如果这个cache-control 配置了no-cache。那就不会出现像max-age一样直接去读相关的缓存,而完全不发请求到服务端的情况。它会发请求到服务端,通过服务端 进一步判断当前浏览器端的缓存有没有过期,从而来知道这个缓存策略是什么样子的。

      6:no-store:使用了这个属性,表示我们完全不会使用任何的缓存策略。

这些属性决定了客户端和服务端交互时所协商的缓存策略。它可以出现在http response header中,也可以出现在 http request header 中。

它的作用呢就是,让客户端和浏览器端知道各自所维护的缓存策略的情况。

 

 

 

二、Expire:

缓存过期时间,用来用来指定资源到期的时间,是服务器端的具体的时间点。

告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。

缓存

 

 

因为设置了缓存策略之后,它会直接从浏览器去读,而不会感知到服务端的变化。

如何去感知服务端相关文件的变化呢?

有两个属性:Last-Modified和If-Modified-Since

 

三、Last-ModifiedIf-Modified-Since

1.基于客户端和服务端协商的缓存机制。

2.last-modified—— response  header

3.if-modified-since—— request  header

4.需要与cache-control 共同使用。

 

缓存

当我从客户端发起一个请求。到我的服务端之后呢,我们的服务端会在一个response header中带上lase-modified 这么一个字段。客户端这个时候拿到了这个last-modified之后呢 跟资源文件一起存到缓存区域中。它作为一个标识,告诉我的浏览器,当前的这个缓存文件呢在最后一次修改的时间是多少。

      之后每次请求这个资源的时候,我的客户端都是在http request header 中带上if-modified-since 这个字段来告诉服务端当前我知道的这个资源的最后时间点是多少。

      那么服务端根据这个时间点判断在客户端的资源有没有更新呢,如果没有更新就返回304的这么一个状态以及当前last-modified 的情况告诉给客户端。

      如果客户端的资源的if-modified-since和服务端的last-modified 有更迭的话,那么服务端就会根据last-modified 把相关的最新的这么一个文件传给客户端,然后返回一个200的状态码。然后客户端将最新的文件缓存起来。

      如果当cache-control中的max-age时,实际上,它是会走max-age(max-age的有效时间内)这个属性,而不是走last-modified。

      当max-age过期之后呢,它才会跟last-modified 来协商。

 

last-modified 的缺点:

  1. 某些服务器不能获取精确的修改时间。
  2. 文件修改时间改了,但是文件内容不变,这个情况下的话,也会让缓存失效

 使用etag来解决这个问题。

 

 

缓存

缓存

etag的优先级高于modified

 

缓存