HTTP面试题——缓存技术

发布于:2025-06-25 ⋅ 阅读:(20) ⋅ 点赞:(0)

目录

HTTP缓存技术有哪些?

什么是强制缓存?

什么是协商缓存?


HTTP缓存技术有哪些?

对于一些具有重复性的HTTP请求,比如每次请求得到的数据都是一样的,我们可以把这对 请求-响应的数据都缓存在本地,那么下次就直接读取本地数据,不必通过网络获取服务器响应的数据了,这样对于http1.1的性能是明显的提升。

对于http缓存有两种实现方式,分别是强制缓存协商缓存

什么是强制缓存?

强制缓存:指的是只要浏览器判断缓存没有过期,直接使用浏览器的缓存,决定是否使用缓存的主动性在浏览器这边

强缓存是利用下面这两个http响应头部(Response Header)字段实现的,都用来表示资源在客户端的有效期:

Cache-Control,是一个相对时间;

Expires,是一个绝对时间;

Cache-Control和Expires字段同时存在的化,Cache-Control的优先级更高于Expires。

Cache-Control实现强制缓存。具体流程如下:

  1. 当浏览器第一次请求访问服务器资源时,服务器会在这返回这个资源的同时,在Response头部加上Cache-control,Cache-Control中这是了过期时间大小;
  2. 浏览器再次请求访问服务器中的该资源时,会想通过请求资源的时间与Cache-Control中的过期时间大小,来计算该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器;
  3. 服务器再次收到请求后,会再次更新Response头部的Cache-Control。

什么是协商缓存?

当我们在浏览器使用开发者工具的时候,你可能会看到过某些请求的响应码是304,这个是告诉浏览器可以使用本地缓存的资源,通常这种通过服务端告知客户端可以使用缓存的方式被称为协商缓存。

协商缓存可以基于两种头部来实现。

第一种:请求头部中的If-Modified-since字段与响应头部中的Last-Modified字段实现,这两个字段的意思是:

  • 响应头部中的Last-Modified:表示这个响应资源的最后修改时间;
  • 请求头部中的If-Modified-Since:当资源过期了,发现响应头中具有Last-Modified声明,则再次发起请求的时候带上Last-Modified的时间,服务器收到请求后发现有If-Modified-Since则与被请求资源的最后修改时间进行对比(Last-Modified),如果最后修改时间比较新,说明资源又被修改过,则返回最新资源,HTTP 200 OK;如果最后修改时间比较旧,说明资源无新修改,响应HTTP 304走缓存。

第二种:头部中的if-None-Match字段与响应头部中的ETag字段,这两个字段的意思是:

  • 响应头部中Etag:唯一标识响应资源;
  • 请求头部中的If-None-match:当资源过期时,浏览器发现响应头里有Etag,则再次向服务器发起请求时,会将请求头If-None-Match值设置为Etag的值。服务器收到请求后进行比对,如果资源没有变化返回304,如果资源变化了返回200。

第一种实现方式是基于时间实现的,第二种实现方式是基于一个唯一标识实现的,相对来说后者可以更加准确的判断文件内容是否被修改,避免由于时间篡改导致的不可靠问题。

如果在第一次请求资源的时候,服务端返回的HTTP响应头部同时有Etag和last-Modified字段,那么客户端在下一次请i去的时候如果带上了Etag和Last-Modified字段信息给服务端,这时Etag的优先级更高,也就是服务端会先判断Etag是否变化了,如果Etag有变化就不用在判断Last-Modified,如果Etag没有变化,然后再看last-Modified。

Etag优先级高于Last-Modified的原因:

因为在没有修改文件内容情况下的最后修改时间也可能发生改变,这导致客户端认为文件被改动了从新发起请求;

有些文件修改在毫秒级内,if-since-Since能检查到的粒度是秒级的,

而且协商缓存这两个字段都需要配合强制缓存中的Cache-Control字段来使用,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求。


网站公告

今日签到

点亮在社区的每一天
去签到