gistfile1.txt http缓存1.强制缓存当缓存数据库中所有的请求数据,客户端直接从缓存数据库中获取数据,当缓存数据库中没有请求数据时,客户端才会从服务器端获取数据2.协商缓存又称之
http缓存 1.强制缓存 当缓存数据库中所有的请求数据,客户端直接从缓存数据库中获取数据,当缓存数据库中没有请求数据时,客户端才会从服务器端获取数据 2.协商缓存 又称之为对比缓存,客户端从缓存数据库中取到一个缓存数据标识,得到标识请求服务器端是否失效,如果没有失效就返回304(来自缓存),这个时候客户端直接从缓存中获取数据,如果标识失效,服务器端重新返回数据 两种缓存机制,可以同时存在,强制缓存的优先级高于协商缓存如若缓存命中,则直接使用缓存数据库数据,不在进行缓存协商。 缓存方案: 在浏览器发送请求的时候 包含 headers和body,缓存信息就存在headers中 Cache-Control: max-age = 3133333 最大缓存使劲 Connection: keep-alive 长连接 Contant-Encodong: gzip Contant-Type: application/javascript Date: '' ETag Last-Modified 最后提交时间 强制缓存 Exprires 是服务器端返回的数据的到期时间,当再次请求的时间小于返回的过期时间,就直接去缓存,这个express是属于http1.0的属性,现在都使用 Cache-Control替代 Cache-Control:属性 private 客户端可以缓存 public 客户端和代理服务器都可以缓存 max-age = t 缓存的内容在t秒后失效 no-cache:需要使用协商缓存来验证缓存数据 no-store:所有内容都不会缓存。 协商缓存: 需要进行对比判断是否可以使用缓存,当浏览器第一次请求数据的服务器,会将缓存表示与数据一起响应给客户端,客户端将他们备份至缓存,再次请求的时候,客户端会将缓存的标识发送给服务器,服务器判断标识,如果没有失效,返回304,浏览器拿到状态码直接使用缓存数据 方式: Last-Modified:服务器在响应请求时,会告诉浏览器资源的最后修改时间。 if-Modified-Since:浏览器再次请求服务器的时候,请求头会包含此字段,后面跟着在缓存中获得的最后修改时间。服务端收到此请求头发现有if-Modified-Since,则与被请求资源的最后修改时间进行对比,如果一致则返回304和响应报文头,浏览器只需要从缓存中获取信息即可。从字面上看,就是说:从某个时间节点算起,是否文件被修改了 如果真的被修改:那么开始传输响应一个整体,服务器返回:200 OK 如果没有被修改:那么只需传输响应header,服务器返回:304 Not Modified if-Unmodified-Since:从字面上看, 就是说: 从某个时间点算起, 是否文件没有被修改 如果没有被修改:则开始`继续'传送文件: 服务器返回: 200 OK 如果文件被修改:则不传输,服务器返回: 412 Precondition failed (预处理错误) EtagEtag:服务器响应请求时,通过此字段告诉浏览器当前资源在服务器生成的唯一标识(生成规则由服务器决定) If-None-Match:再次请求服务器时,浏览器的请求报文头部会包含此字段,后面的值为在缓存中获取的标识。服务器接收到次报文后发现If-None-Match则与被请求资源的唯一标识进行对比。 不同,说明资源被改动过,则响应整个资源内容,返回状态码200。 相同,说明资源无心修改,则响应header,浏览器直接从缓存中获取数据信息。返回状态码304. 但是实际应用中由于Etag的计算是使用算法来得出的,而算法会占用服务端计算的资源,所有服务端的资源都是宝贵的,所以就很少使用Etag了。