面试官:你了解HTTP的缓存技术吗?

本文详细解释了浏览器如何使用缓存技术提高访问效率,包括强制缓存的过期时间判断和Cache-Control字段,以及协商缓存的两种实现方式——基于时间(If-Modified-Since)和基于唯一标识(If-None-Match)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缓存技术的使用可以说非常普遍。

举个例子,我们通过浏览器访问某些网站时,如果重复访问同一个页面每次都向服务器发送请求获取数据,这样显然效率和使用体验不是很好,所以浏览器将重复性HTTP请求的数据缓存在本地

HTTP缓存的实现有两种方式,分别是强制缓存协商缓存。

1. 强制缓存

强制缓存是浏览器判断缓存数据是否过期,如果未过期则使用缓存数据;是否使用缓存的决定者是浏览器

强制缓存是使用HTTP请求的响应头部字段实现的,表示资源在客户端缓存的有效期。如果两个字段同时设置的话,Cache-Control的优先级更高。

  • Cache-Control:相对时间

  • Expires:绝对时间

强制缓存的具体流程:

  • 浏览器第一次访问服务器中的数据时,服务器响应数据的同时在响应头中通过Cache-Control设置缓存过期的时间。

  • 当浏览器再次请求服务器中该数据时,浏览器会先通过请求数据的时间与Cache-Control中设置的缓存过期时间计算数据是否过期。未过期则直接使用缓存数据,过期则再次请求服务器获取数据。

  • 服务器再次收到请求后会响应数据,同时更新Cache-Control中的缓存过期时间。

2. 协商缓存

协商缓存是浏览器向服务器发送请求获取数据,服务器并不响应数据给浏览器,而是返回给浏览器一个响应状态码304,这个状态码的意思是告诉浏览器可以使用本地缓存的数据;是否使用缓存的决定者是服务器

协商缓存是使用HTTP请求的请求头部和响应头部中的字段实现的。

第一种:

  • 请求头部的If-Modified-Since:请求时携带Last-Modified中的时间。

  • 响应头部的Last-Modified:响应数据的最后一次修改时间。

第二种:

  • 请求头部的If-None-Match:请求时携带Etag中的唯一标识。

  • 响应头部的Etag:响应资源的唯一标识。

第一种是基于时间实现的,第二种是基于响应资源的唯一标识实现的;第二种实现方式可以更好的判断资源是否被修改过,从而避免篡改导致不可靠问题。

如果第一次请求数据后,服务器返回的响应头中同时包含了Last-Modified和Etag两个字段,那么再次请求时请求头也会携带这两个字段的信息,但是Etag的优先级更高。

注意:使用协商缓存前都会先进行强制缓存的判断,只有强制缓存判断数据过期后,才会发起带有协商缓存字段的请求。

使用第一种方式和第二种方式实现协商缓存的流程基本一致,区别就在于缓存过期后,再次请求该数据时请求头部携带的是数据最后一次修改时间还是数据唯一标识,服务器根据携带的内容进行判断并做出响应。

下面是使用第二种方式实现协商缓存的具体流程:

  • 浏览器第一次访问服务器的数据时,服务器返回数据的同时返回一个由该响应数据生成的唯一标识。

  • 浏览器再次请求服务器中的该数据时,会先检查强制缓存是否过期;如果没有过期则使用缓存数据;如果已经过期则向服务器发送HTTP请求,请求头部通过If-None-Match字段携带Etag中的唯一标识。

  • 服务器收到请求后通过If-None-Match中的唯一标识与请求数据生成唯一标识对比;如果一致则返回状态码304;不一致则返回状态码200和请求数据,并在响应头部加上新的Etag唯一标识。

  • 浏览器如果收到状态码304则从缓存获得数据,否则更新缓存的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值