当前位置: 首页 > 科技观察

前端百题第一篇理解HTTP缓存

时间:2023-03-20 22:29:52 科技观察

缓存是指将资源保存在代理服务器或客户端本地磁盘中的副本。使用缓存可以减少对源服务器的访问,节省通信量和通信时间。浏览器缓存是指浏览器将之前请求的文件缓存起来,以便下次访问时再次使用,从而节省带宽,提高访问速度,减轻服务器压力。今天说的HTTP缓存机制就是利用HTTP响应头把请求的资源缓存在浏览器中。缓存方式主要有两种:强缓存和协商缓存。3.1强缓存强缓存是指在缓存时间内不会向服务器发送请求,只有在过期日期后才会向服务器发送请求。整个过程如下:HTTP中有两个响应头表示强缓存,分别是:Expires、Cache-Control,下面分别介绍这两个字段。3.1.1ExpiresExpires是HTTP1.0中的一个字段,是一个绝对时间,即服务器时间。浏览器检查当前时间,如果过期时间还没到,直接使用缓存文件。3.1.2Cache-Control由于Expires中server时间和client时间不一致的问题,HTTP1.1中新增了一个Cache-Control字段(注意:如果同时有cache-control和expires,浏览器总是先使用它)cache-control),通过设置max-age来保存一个相对时间,表示它的内容在这个相对时间是有效的。Cache-Control字段常用值如下:private:默认值,表示客户端可以缓存响应,中间代理、CDN等不能缓存响应;public:表示客户端和代理服务器都可以缓存;max-age=xxx:缓存的内容会在xxx秒后过期;no-cache:需要协商缓存来验证缓存的数据;no-store:不缓存所有内容(包括协商缓存),服务器每次都会请求最新的资源;must-revalidate:缓存过期前可以使用,过期后必须和服务器验证。3.1.3为什么要添加Cache-Control字段?Expires字段有个问题,就是该字段使用的是绝对时间,服务器时间可能和客户端时间不一致,可能会出问题,所以增加了Cache-Control字段。3.2协商缓存协商缓存会向服务器发送请求,判断缓存数据是否过期,如果过期则返回新的内容,如果没有过期则使用本地缓存数据。对于协商缓存,主要用到两个字段:Last-Modify和Etag。整体流程如下:注:图片来自(https://www.cnblogs.com/zhouwenhong/p/3928645.html)3.2.1Last-Modifylast-modified是HTTP1.0中的一个字段,即第一次请求资源时服务器返回的字段,表示最后一次更新的时间。if-modified-since字段在浏览器下次请求资源时发送。服务器将本地Last-modified时间与if-modified-since时间进行比较。如果不一致,则认为缓存已过期,将新的资源返回给浏览器;如果时间一致,则发送304状态码,让浏览器继续使用缓存。3.2.2EtagEtag是HTTP1.1中新增的字段,是资源的实体标识(hash字符串)。当资源的内容更新时,Etag会发生变化。服务器会判断Etag是否发生变化,如果发生变化则返回新的资源,否则返回304。3.2.3为什么要添加Etag字段?在存在Last-Modify字段的情况下,增加Etag字段的原因主要有以下几点:一些文件修改后,其内容并没有改变,只是影响了修改时间。这时候,缓存不应该被认为过期了;一些文件修改过于频繁(几秒内),但是If-Modify-Since可以检查的精度是Second级别,这会导致问题;有些服务器不能准确获取文件的最后修改时间。本文转载自微信公众号“牵着风筝”,可通过以下二维码关注。转载本文请联系风筝持有人公众号。