web缓存机制

什么是web缓存

Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在于Web服务器和客户端(浏览器)之间的副本。缓存会根据进来的请求保存输出内容的副本;当下一个请求来到的时候,若是是相同的URL,缓存会根据缓存机制决定是直接使用副本响应访问请求,仍是向源服务器再次发送请求。比较常见的就是浏览器会缓存访问过网站的网页,当再次访问这个URL地址的时候,若是网页没有更新,就不会再次下载网页,而是直接使用本地缓存的网页。只有当网站明确标识资源已经更新,浏览器才会再次下载网页html

web缓存类型

数据库数据缓存

Web应用,特别是SNS类型的应用,每每关系比较复杂,数据库表繁多,若是频繁进行数据库查询,很容易致使数据库不堪重荷。为了提供查询的性能,会将查询后的数据放到内存中进行缓存,下次查询时,直接从内存缓存直接返回,提供响应效率。好比经常使用的缓存方案有memcached等。web

服务器端缓存

  • 代理服务器缓存
    代理服务器是浏览器和源服务器之间的中间服务器,浏览器先向这个中间服务器发起Web请求,通过处理后(好比权限验证,缓存匹配等),再将请求转发到源服务器。代理服务器缓存的运做原理跟浏览器的运做原理差很少,只是规模更大。能够把它理解为一个共享缓存,不仅为一个用户服务,通常为大量用户提供服务,所以在减小相应时间和带宽使用方面颇有效,同一个副本会被重用屡次。常见代理服务器缓存解决方案有Squid等数据库

  • CDN缓存
    CDN(Content delivery networks)缓存,也叫网关缓存、反向代理缓存。CDN缓存通常是由网站管理员本身部署,为了让他们的网站更容易扩展并得到更好的性能。浏览器先向CDN网关发起Web请求,网关服务器后面对应着一台或多台负载均衡源服务器,会根据它们的负载请求,动态将请求转发到合适的源服务器上。虽然这种架构负载均衡源服务器之间的缓存无法共享,但却拥有更好的处扩展性。浏览器

浏览器端缓存

浏览器缓存根据一套与服务器约定的规则进行工做,在同一个会话过程当中会检查一次并肯定缓存的副本足够新。若是你浏览过程当中,好比前进或后退,访问到同一个图片,这些图片能够从浏览器缓存中调出而即时显现。缓存

Web应用层缓存

应用层缓存指的是从代码层面上,经过代码逻辑和缓存策略,实现对数据,页面,图片等资源的缓存,能够根据实际状况选择将数据存在文件系统或者内存中,减小数据库查询或者读写瓶颈,提升响应效率。服务器

web缓存工做原理

全部的缓存都是基于一套规则来帮助他们决定何时使用缓存中的副本提供服务(假设有副本可用的状况下,未被销毁回收或者未被删除修改)。这些规则有的在协议中有定义(如HTTP协议1.0和2.0),有的则是由缓存的管理员设置(如DBA、浏览器的用户、代理服务器管理员或者应用开发者)架构

浏览器端的缓存规则

对于浏览器端的缓存来说,这些规则是在HTTP协议头和HTML页面的Meta标签中定义的。他们分别重新鲜度和校验值两个维度来规定浏览器是否能够直接使用缓存中的副本,仍是须要去源服务器获取更新的版本。app

新鲜度(过时机制):也就是缓存副本有效期。一个缓存副本必须知足如下条件,浏览器会认为它是有效的,足够新的:负载均衡

  • 含有完整的过时时间控制头信息(HTTP协议报头Cache-ControlExpires),而且仍在有效期内;memcached

  • 若是已经超过有效期,发起请求到服务器验证Etag,若是没有更新,仍是使用浏览器缓存

知足以上两个状况的一种,浏览器会直接从缓存中获取副本并渲染。
校验值(验证机制):

  • Cache-ControlExpires的做用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据仍是从新发请求到服务器取数据。只不过Cache-Control的选择更多,设置更细致,若是同时设置的话,其优先级高于Expires

  • 服务器返回资源的时候有时在控制头信息带上这个资源的实体标签Etag(Entity Tag),它能够用来做为浏览器再次请求过程的校验标识。如过发现校验标识不匹配,说明资源已经被修改或过时,浏览器需求从新获取资源内容。

  • 若是检测到本地的缓存仍是有效的时间范围内,浏览器直接使用本地副本,不会发送任何请求。二者一块儿使用时,Cache-Control/Expires的优先级要高于Last-Modified/ETag。即当本地副本根据Cache-Control/Expires发现还在有效期内时,则不会再次发送请求去服务器询问修改时间(Last-Modified)或实体标识(Etag)了。

缓存有关的HTTP消息报头

图片描述
图片描述
通常状况下,使用Cache-Control/Expires会配合Last-Modified/ETag一块儿使用,由于即便服务器设置缓存时间, 当用户点击“刷新”按钮时,浏览器会忽略缓存继续向服务器发送请求,这时Last-Modified/ETag将可以很好利用304,从而减小响应开销。

Last-Modified/ETag

你可能会以为使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为何还须要Etag(实体标识)呢?HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:
Last-Modified标注的最后修改只能精确到秒级,若是某些文件在1秒钟之内,被修改屡次的话,它将不能准确标注文件的新鲜度
若是某些文件会被按期生成,当有时内容并无任何变化,但Last-Modified却改变了,致使文件无法使用缓存
有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形
Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的惟一标识符,可以更加准确的控制缓存。Last-ModifiedEtag是能够一块儿使用的,服务器会优先验证Etag,一致的状况下,才会继续比对Last-Modified,最后才决定是否返回304

用户操做行为与缓存

用户在使用浏览器的时候,会有各类操做,好比输入地址后回车,按F5刷新等,这些行为会对缓存有什么影响呢?
图片描述
经过上表咱们能够看到,当用户在按F5进行刷新的时候,会忽略Cache-Control/Expires的设置,会再次发送请求去服务器请求,而Last-Modified/ETag仍是有效的,服务器会根据状况判断返回304仍是200;而当用户使用Ctrl+F5进行强制刷新的时候,只是全部的缓存机制都将失效,从新从服务器拉去资源。

参考资料

Web缓存机制系列

相关文章
相关标签/搜索