什么是强缓存和协商缓存
10 分钟阅读
•
1157 字
+
1114 词
强缓存是根据
Expire字段
和
Cache-Control字段
实现的,一个是
绝对时间
,一个是
相对时间
。当强缓存失效时呢,就会发起
协商缓存
请求。
协商缓存有两种实现,
一种是基于Last-Modified来判断
,也就是根据
最近修改时间
,但是这种如果
资源本身并没有修改
,但是修改时间还是
可能有变化
,这样导致缓存失效。并且如果修改耗时极短,导致修改时间也没变化,但是这个时候资源本身已经改变了。另一种是根据
If-None-Match字段和Etag来判断的
,判断E-tag是否有变化,
E-tag是服务器为资源生成的唯一标识符
。根据文件内容计算出的
哈希值
,服务端将其和资源一起放回给客户端。
强缓存和协商缓存是HTTP缓存机制的两种类型
,它们用于
减少服务器的负担和提高网页加载速度
。
参考答案:
- 强缓存 :客户端在没有向服务器发送请求的情况下,直接从本地缓存中获取资源。
-
Expires强缓存:设置一个 强缓存时间 ,此时间范围内,从内存中读取缓存并返回。但是因为Expires判断强缓存过期的机制是 获取本地时间戳 , 与之前拿到的资源文件中的Expires字段的时间做比较来判断 是否需要对服务器发起请求。这里有一个巨大的漏洞:“如果我本地时间不准咋办?”所以目前已经被废弃了。 -
Cache-Control强缓存: 目前使用 的强缓存是通过 HTTP响应头 中的Cache-Control字段实现,通过max-age来告诉浏览器在指定时间内 可以直接使用缓存数据 ,无需再次请求。
-
协商缓存
:当强缓存失效时,浏览器会发送请求到服务器,通过
ETag或Last-Modified等HTTP响应头与服务器进行验证,以确定资源是否被修改。如果资源未修改,服务器返回304 Not Modified状态码,告知浏览器使用本地缓存; 如果资源已修改,则返回新的资源,浏览器更新本地缓存 。这种方式需要与服务器通信,但可以 确保用户总是获取最新的内容 。
-
基于
Last-Modified的协商缓存-
Last-Modified是资源的最后修改时间,服务器在响应头部中返回。 -
当客户端读取到
Last-modified的时候,会在下次的请求标头中携带一个字段:If-Modified-Since,而这个请求头中的If-Modified-Since就是服务器第一次修改时候给他的时间 -
服务器比较请求中的
If-Modified-Since值与当前资源的Last-Modified值,如果比对的结果是没有变化,表示资源未发生变化,返回状态码304 Not Modified。如果比对的结果说资源已经更新了,就会给浏览器正常返回资源,返回200状态。
- 因为是更改文件修改时间来判断的,所以在文件内容本身不修改的情况下,依然有可能更新文件修改时间(比如修改文件名再改回来),这样,就有可能文件内容明明没有修改,但是缓存依然失效了。
- 当文件在极短时间内完成修改的时候(比如几百毫秒)。因为文件修改时间记录的最小单位是秒,所以,如果文件在几百毫秒内完成修改的话,文件修改时间不会改变,这样,即使文件内容修改了,依然不会返回新的文件。
-
-
基于ETag的协商缓存:将原先协商缓存的比较时间戳的形式修改成了比较文件指纹(根据文件内容计算出的唯一哈希值)
。
-
ETag是服务器为资源生成的唯一标识符(文件指纹),可以是根据文件内容计算出的哈希值,服务端将其和资源一起放回给客户端。 -
客户端在请求头部的
If-None-Match字段中携带上次响应的ETag值。 -
服务器比较请求中的
If-None-Match值与当前资源的ETag值,如果匹配,表示资源未发生变化,返回状态码304 Not Modified。如果两个文件指纹不吻合,则说明文件被更改,那么将新的文件指纹重新存储到响应头的ETag中并返回给客户端
-