HTTP缓存
http缓存分为两种:
一种是强缓存:使用expires(http1.0)和cache-control
expires使用时可以在Response Header 中定义一个expires的字段来定义缓存最终失效时间;
但是expires有个极大缺陷:1是服务端时间和客户端时间可能不一致(客户端时间可以自行修改)
导致缓存功能存在缺陷
cache-control(http1.1,优先级大于exprise)解决了expires的问题,他拥有多个字段可以控制缓存,max-age,s-max-age,no-store,
no-cache public 和 private等
max-age s-max-age 这两个字段是一个数字,表示资源过了多少秒之后失效,浏览器中两种都起作用,
s - max - age优先级大于max - age,在代理服务器中s - max - age有效
no-cache no-store
no-cache表示不直接验证浏览器缓存情况,而是通过协商缓存(Etag)来判断是否需要更新,
no - store会忽略所有缓存协议,直接请求最新资源
pragma:优先级高于 cache-control 和 expires 使用no-cache 和 no-store两个字段
第二种是协商缓存:
协商缓存使用 last-modified 和 etag(etag级别优先于last-modified)
last-modified 该字段定义后,服务器端会用这个字段和服务器端资源的最后修改时间做对比,若一致则证明没有被修改,
告知浏览器可直接使用缓存并返回 304;若不一致则直接返回修改后的资源,并修改 last - modified 为新的值。
last-modefied有两个缺陷,1:只能精确到秒,一秒以内的数据变动无法侦听;
2:只要编辑了就会有修改,不管内容有没有改变;
etag : 该字段使用时会生成一个资源字符码,服务端确认字符码没有修改时返回304,使用浏览器缓存,如果服务端返回
的字符码不一致的话,会重新拉取服务端代码,并更新这个资源字符码;
etag的缺陷是:每次生成资源字符码需要耗费服务端性能