减小网络带宽消耗
下降服务器压力
减小网络延迟,加快页面打开速度html
数据库数据缓存:为了提供查询的性能,会将查询后的数据放到内存中进行缓存,下次查询时,直接从内存缓存直接返回,提供响应效率
代理服务器缓存:代理服务器是浏览器和源服务器之间的中间服务器,浏览器先向这个中间服务器发起Web请求,通过处理后(好比权限验证,缓存匹配等),再将请求转发到源服务器。
CDN缓存:浏览器先向CDN网关发起Web请求,网关服务器后面对应着一台或多台负载均衡源服务器,会根据它们的负载请求,动态将请求转发到合适的源服务器上。虽然这种架构负载均衡源服务器之间的缓存无法共享,但却拥有更好的处扩展性。从浏览器角度来看,整个CDN就是一个源服务器
浏览器端缓存
Web应用层缓存web
HTTP信息头中包含Cache-Control:no-cache,pragma:no-cache,或Cache-Control:max-age=0等告诉浏览器不用缓存的请求
须要根据Cookie,认证信息等决定输入内容的动态请求是不能被缓存的
通过HTTPS安全加密的请求
POST请求没法被缓存
HTTP响应头中不包含Last-Modified/Etag,也不包含Cache-Control/Expires的请求没法被缓存数据库
Web开发者能够在HTML页面的<head>节点中加入<meta>标签,代码以下:浏览器
<meta http-equiv="Pragma" content="no-cache">
上述代码的做用是告诉浏览器当前页面不被缓存,每次访问都须要去服务器拉取。使用上很简单,但只有部分浏览器能够支持,并且全部缓存代理服务器都不支持,由于代理不解析HTML内容自己。缓存
Cache-Control与Expires的做用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据仍是从新发请求到服务器取数据。只不过Cache-Control的选择更多,设置更细致,若是同时设置的话,其优先级高于Expires。
配置Last-Modified/ETag的状况下,浏览器再次访问统一URI的资源,仍是会发送请求到服务器询问文件是否已经修改,若是没有,服务器会只发送一个304回给浏览器,告诉浏览器直接从本身本地的缓存取数据;若是修改过那就整个数据从新发给浏览器;
Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:
Last-Modified标注的最后修改只能精确到秒级,若是某些文件在1秒钟之内,被修改屡次的话,它将不能准确标注文件的新鲜度
若是某些文件会被按期生成,当有时内容并无任何变化,但Last-Modified却改变了,致使文件无法使用缓存
有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形安全
Cache-Control/Expires的优先级要高于Last-Modified/ETag。即当本地副本根据Cache-Control/Expires发现还在有效期内时,则不会再次发送请求去服务器询问修改时间(Last-Modified)或实体标识(Etag)了。
使用Cache-Control/Expires会配合Last-Modified/ETag一块儿使用,由于即便服务器设置缓存时间, 当用户点击“刷新”按钮时,浏览器会忽略缓存继续向服务器发送请求,这时Last-Modified/ETag将可以很好利用304,从而减小响应开销。服务器
当用户在按F5进行刷新的时候,会忽略Expires/Cache-Control的设置,会再次发送请求去服务器请求,而Last-Modified/Etag仍是有效的,服务器会根据状况判断返回304仍是200;而当用户使用Ctrl+F5进行强制刷新的时候,只是全部的缓存机制都将失效,从新从服务器拉去资源
总结一下浏览器请求的过程:
Etag发送过去的头名字叫:If-None-Match
Last-Modified发送过去的头名字叫:If-Modified-Since
参考文献:
Web缓存机制系列
浏览器缓存机制网络