http缓存

105 阅读2分钟

HTTP缓存作用

客户端

页面加载速度变快,http请求次数变少

服务端

由于http请求的次数变少了,所以服务器的压力变小了

什么是http缓存

http缓存就是在浏览器从服务器请求来的资源 通过缓存规则保存在本地

第二次请求不在从服务器请求,直接在本地获取资源,降低服务器的压力

http缓存的类型

1.不缓存

每一次都请求服务器

2.强缓存

在一定时间内如果请求的是相同的资源,不管请求,都是在本地获取资源,不管资源是否更新都不走hTTP

3.协商缓存

和服务器协商是否缓存

http缓存怎么控制

服务端设置响应头

设置http缓存的响应头段有哪些

设置强缓存

http /1.0

需要设置expires (时间到期或失效)

const nowtime = Date.now() + 1 * 60 * 1000
new Date(nowtime).toUTCString()
res.setHeader("expires",北京时间等于GMT+1分钟 +8小时)

http/1.1

res.setHeader(cache-Control,‘max-age=’)

res.setHeader()

为了兼容都会设置

设置不缓存

http /1 .0

不设置expires

http/1.1

不设置任何缓存相关响应头

Cache control 设置no-store

协商缓存

第一步

走缓存的必要条件 cache-control : no-cache

第二步

LastModified

第一次请求带上last-modified,内容为文件的最后一次时间

第二次请求 请求头带回IF-MODIFIED-Since 对比 当前读取的文件最后修改时间对比

或者

ETag 文件指纹

第一次请求带上ETag,内容为文件指纹

此时浏览器会生成一个if-none-match

第二次请求会带上之前的指纹if-none-match与查询当前请求的文件指纹对比

第三步

相同就返回304

不同返回新的数据

ETAG

Etag的出现,可以在一定程度上解决这个问题,但不能说完全解决,他也存在他的问题,接下来分析一下他的实现原理:

  1. ETag(实体标签),根据**摘要算法将实体内容生成的一段hash字符串**,文件改变,ETag也随之改变
  2. 但是对于大文件,不会直接全量比对,可以用文件的大小,开头、或某一段生成一个指纹
  3. 浏览器首次请求资源时,服务器会将**ETag**与资源一同返回给浏览器。
  4. 再次请求时,客户端请求头会携带**签名标识(If-None-Match)** ,并在服务端对比两个签名
  5. 若相等,直接返回**304状态码**,读取浏览器的缓存中对应缓存文件;
  6. 若不相等,返回最新内容,并给文件设置新的修改时间。
  7. ETag**不管是否生效,都需要与服务端发生交互**
  8. 响应头设置