1.web缓存的种类:
(1)数据库的缓存
我们可能听说过memcached(高性能的缓存系统),它就是一种数据库层面的缓存方案,数据库缓存是指,当web应用的关系比较复杂,数据库中的表很多的时候,如果进行频繁的数据库查询,很容易导致数据库不堪重负。为了提供查询的性能,将查询的数据放在能存中缓存,下次查询的时候,直接从内存直接返回。效率高。
(2)CDN缓存
CDN缓存一般是由网站管理员自己部署,为了让他们的网站更容易扩展获得更好的性能,通常情况下,web向CDN网关发起web请求,网关服务器后面对应了一台或者多台负载均衡的服务器,会根据他们的负载请求,动态的将请求转发到合适的源服务器上。从浏览器角度看,整个CDN就是一个源服务器,从这个层面来说,浏览器和服务器之间的缓存机制,在这种构造下使用。
(3)代理服务器缓存是浏览器和服务器之间的中间服务器,浏览器先向这个中间服务器发起请求,经过处理后再将请求发送的源服务器。代理服务器缓存的运作原理和浏览器的运作原理差不多,只是规模更大
(4)浏览器实现HTTP缓存,我们通过浏览器使用HTTP协议与服务器交互的时候,浏览器就会根据一套与服务器约定的规则进行缓存工作。
(5)应用层缓存是指我们再大码层面上的缓存,通过代码逻辑把我们请求过的数据或者资源等缓存起来,再次需要数据时通过逻辑上的处理选择可用的缓存数据。
2.为什么需要浏览器缓存?我们需要做些什么?
我们知道HTTP协议,在客户端和浏览器简历连接时需要消耗时间,而大的响应需要再客户端和服务器之间进行多次通信才能获得完整的响应。这延时了浏览器可以使用和处理内容的时间,这就增加了访问服务器的数据和资源的成本,因此利用浏览器的缓存机制重用以前的数据编程了性能优化时必须要考虑的问题
解决办法:为每个资源制定一个明确的缓存策略,定义资源是否可以缓存,由谁来缓存,可以缓存多久,并且在缓存到期时如何有效的重新验证,当服务器返回一个响应时,它需要响应头中提供的cache-Control和Etag.
3.使用etag验证缓存的http响应
服务器通过ETag HTTP头传递验证码,当浏览器的资源过期后再次请求是,里晒亲戚默认会通过If-None-Match传递Etag验证码,通过验证码可以记性高效的资源更新检测,如果资源未更改,则不会传输任何数据。
Etag主要是验证响应过期以后资源是否被修改。
如果浏览器发出的验证码一致,说明资源未被修改过,服务器会返回锁,这样我们就可以跳过下载,利用已经缓存的资源。
4.什么是cache-Control?如何定义cache-Control策略?
服务器响应浏览器请求时响应头中的cache-Control响应头使得每个资源都可以通过cache-Control Http头来定义自己的缓存策略。
no-cache : 表示必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。因此,如果存在合适的验证令牌 (ETag),no-cache 会发起往返通信来验证缓存的响应,如果资源未被更改,可以避免下载。
no-store : 禁止缓存任何响应,也就是说每次用户请求资源时,都会向服务器发送一个请求,每次都会下载完整的响应。
public : 如果响应被标记为public,即使有关联的 HTTP 认证,甚至响应状态码无法正常缓存,响应也可以被缓存。
private : 浏览器可以缓存private响应,但是通常只为单个用户缓存,因此,不允许任何代理服务器对其进行缓存 。比如,用户浏览器可以缓存包含用户私人信息的 HTML 网页,但是 CDN 不能缓存。
max-age : 用来设置资源被缓存的最长时间(单位是秒)。
5.已经缓存的响应,如何更新和废弃?
一般情况下,浏览器发出的所有的HTTP请求会首先被路由到浏览器的缓存,以查看是否缓存了可以用于实现请求的有效响应,如果有匹配的响应,会直接从缓存中读取响应,这样就避免了网络延迟以及传输产生的数据成本,然而,如果我们希望跟新或废弃已缓存的响应,该怎么办?假设我们已经告诉某个css样式缓存长达24小时,但是设计人员刚刚提交了更新,我们希望所有用户都能使用,我们该如何通知所有访问者缓存css副本已经过时。
实际上以前没有请求过该资源的新的用户会得到更新的资源,但是请求过资源的用户将在过期时间达到之前一直得到旧的被缓存的资源,直到他手动的去清理了浏览器的缓存。手动清理浏览器缓存这种事可能只有程序员才会做,那么我们要怎么做才能让用户得到更新后的资源呢?