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的出现,可以在一定程度上解决这个问题,但不能说完全解决,他也存在他的问题,接下来分析一下他的实现原理:
- ETag(实体标签),根据**
摘要算法将实体内容生成的一段hash字符串**,文件改变,ETag也随之改变 - 但是对于大文件,不会直接全量比对,可以用文件的大小,开头、或某一段生成一个指纹
- 浏览器首次请求资源时,服务器会将**
ETag**与资源一同返回给浏览器。 - 再次请求时,客户端请求头会携带**
签名标识(If-None-Match)** ,并在服务端对比两个签名。 - 若相等,直接返回**
304状态码**,读取浏览器的缓存中对应缓存文件; - 若不相等,返回最新内容,并给文件设置新的修改时间。
- ETag**
不管是否生效,都需要与服务端发生交互** 响应头设置