缓存

来源:互联网 发布:之乎不潮流只先锋 编辑:程序博客网 时间:2024/06/05 00:30

https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=zh-cn#etag-

http://my.oschina.net/leejun2005/blog/369148

https://segmentfault.com/a/1190000004132566


浏览器缓存基本认知

分为两种:

强缓存和协商缓存

共同点:命中后 都是从客户端缓存中加载资源

区别:强缓存不发送请求到服务器,协商缓存会发送请求到服务器



一.强缓存的原理

强缓存是利用Expires或者Cache-Control这两个http response header实现的,它们都用来表示资源在客户端缓存的有效期。

Cache-Control头在HTTP/1.1规范中定义,取代了之前用来定义响应策略的头(例如Expires)。

当前所有的浏览器都支持Cache-Control,因此使用它就足够了。


Cache-Control各个值的含义:


no-cache和no-store

no-cache:表示必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。因此,如果存在合适的验证令牌(ETAG),no-cache会发起往返通信来验证缓存的响应,如果资源未被更改,可以避免下载。

no-store:直接禁止缓存


public和private

public:响应被标记为public,即使有关联的HTTP认证,设置响应状态码无法正常缓存,响应也可以被缓存。大多数情况下,public不是必须的,因为明确的缓存信息(例如:max-age)已经表示响应可以被缓存

private:浏览器可以缓存private的响应,但是通常只为单个用户缓存,因此,不允许任何中继缓存对其进行缓存,例如:用户浏览器可以缓存包含用户私人信息的HTML页面,但是CDN不能缓存。


max-age

该指令指定从当前请求开始,允许获取的响应被重用的最长时间(单位为秒),例如:max-age=60表示响应可以再缓存和重用60秒。



定义最优的Cche-Control策略


Last-Modified/If-Modified-Since:Last-Modified/If-Modified-Since要配合Cache-Control使用。

Last-Modified:标示这个响应资源的最后修改时间。web服务器在响应请求时,告诉浏览器资源的最后修改时间。

If-Modified-Since:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 (无需包体,节省浏览),告知浏览器继续使用所保存的cache。



Etag/If-None-Match:Etag/If-None-Match也要配合Cache-Control使用。

Etag:web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)。Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。

If-None-Match:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-Match (Etag的值)。web服务器收到请求后发现有头If-None-Match 则与被请求资源的相应校验串进行比对,决定返回200或304。



既生Last-Modified何生Etag?你可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag(实体标识)呢?HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:

Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间

如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存

有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形


Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。Last-Modified与ETag一起使用时,服务器会优先验证ETag。

yahoo的Yslow法则中则提示谨慎设置Etag:需要注意的是分布式系统里多台机器间文件的last-modified必须保持一致,以免负载均衡到不同机器导致比对失败,Yahoo建议分布式系统尽量关闭掉Etag(每台机器生成的etag都会不一样,因为除了 last-modified、inode 也很难保持一致)


0 0
原创粉丝点击