web缓存的种类
1.数据库缓存
我们可能听说过memcached,它就是一种数据库层面的缓存方案。数据库缓存是指,当web应用的关系比较复杂,数据库中的表很多的时候,如果频繁进行数据库查询,很容易导致数据库不堪重荷。为了提供查询的性能,将查询后的数据放到内存中进行缓存,下次查询时,直接从内存缓存直接返回,提供响应效率。
2. CDN缓存
CDN缓存一般是由网站管理员自己部署,为了让他们的网站更容易扩展并获得更好的性能。通常情况下,浏览器先向CDN网关发起Web请求,网关服务器后面对应着一台或多台负载均衡源服务器,会根据它们的负载请求,动态将请求转发到合适的源服务器上。从浏览器角度来看,整个CDN就是一个源服务器,从这个层面来说,浏览器和服务器之间的缓存机制,在这种架构下同样适用。
3. 代理服务器缓存
代理服务器是浏览器和源服务器之间的中间服务器,浏览器先向这个中间服务器发起Web请求,经过处理后(比如权限验证,缓存匹配等),再将请求转发到源服务器。代理服务器缓存的运作原理跟浏览器的运作原理差不多,只是规模更大。
4. 浏览器缓存
每个浏览器都实现了 HTTP 缓存,我们通过浏览器使用HTTP协议与服务器交互的时候,浏览器就会根据一套与服务器约定的规则进行缓存工作。
5. 应用层缓存
应用层缓存是指我们在代码层面上做的缓存。通过代码逻辑,把曾经请求过的数据或资源等,缓存起来,再次需要数据时通过逻辑上的处理选择可用的缓存的数据。
浏览器缓存
浏览器缓存是当我们使用浏览器访问某些网站页面或者http服务器时,浏览器会根据服务器端返回的缓存设置响应头将响应头内容缓存到浏览器,下次可以直接使用缓存内容或者仅需要去服务器验证内容是否过期即可。
这样的好处是可以减少浏览器和服务器端来回传输的数据量,节省带宽提升性能。
例子:
第一次请求服务器返回的状态码是200
按F5刷新,返回的状态码为304,表示服务器端没有修改过该文档,浏览器缓存的内容还是最新的。
第一次请求响应头部字段:
Last-Modified: 表示文档最后修改时间,当去服务器验证时会拿这个时间验证
Expires: http/1.0规范定义,表示文档在浏览器中过期的时间,当缓存内容超过这个时间则需要重新去服务器获取最新内容
Cache-Control: http/1.1规范定义,表示浏览器缓存控制,max-age表示文档在浏览器中缓存的秒数
规范定义,Cache-Control的优先级高于Expires,一般情况下Expires=当前系统时间+缓存时间(Cache-Control: max-age)
按F5刷新当前页面,浏览器发送的请求头部字段:
If-Modified-Since: 其值是上次请求响应中的Last-Modified,浏览器会拿这个时间去服务器验证内容是否发生了变更
接着收到了响应,状态码为304则告诉浏览器内容未发生变更,直接使用缓存内容吧
如果想强制从服务器端获取最新内容,可按Ctrl+F5,浏览器不会携带If-Modified-Since字段,并带上Cache-Control: no-chche和Pragma: no-chche,这是为了告诉浏览器说请给我一份最新的内容
from cache
当我们使用F5、Ctrl+F5、地址栏输入地址时,都会去服务器验证内容
例子:
从A页面跳转到A页面或者从A页面跳转到B页面,此时如果内容还在缓存时间之内,直接从浏览器获取内容,而不去服务器端
通过浏览器历史记录进行前进后退时也会走from cache
Age: 一般用于代理层(如CDN),其表示此内容在代理层从缓存到现在经过了多长时间了
Vary: 用于浏览器和代理层协商什么情况下使用哪个版本的缓存内容
比如Content-Encoding: gzip,即缓存代理层缓存了gzip版本的内容
后续的请求再请求是Accept-Encoding头部中包含gzip时才能使用该代理层的缓存
Via: 表示访问到最终内容经过了那些代理层,用的什么协议,代理层是否缓存命中等,通过它可以进行一些故障诊断
ETag:
为每个资源指定一个明确的缓存策略,用以定义资源是否可以缓存,由谁来缓存,可以缓存多久,并且在缓存时间到期时如何有效地重新验证。当服务器返回一个响应时,它需要在响应头中提供Cache-Control和ETag。
现在默认浏览器均默认使用HTTP 1.1,所以Expires和Last-Modified的作用基本可以忽略,具备Cache-Control和Etag即可。
//////////////////////////////////////////////////////////////////////////////////////
我们所要做的就是,确保每个服务器响应都提供正确的 HTTP 头指令,以指导浏览器何时可以缓存响应以及可以缓存多久。
服务器在返回响应时,还会发出一组 HTTP 头,用来描述内容类型、长度、缓存指令、验证令牌等。
《参考开发者头条之聊聊高并发系统之HTTP缓存》
《开发者头条之HTTP缓存的四种风味与缓存策略》
http://www.admin10000.com/document/6299.html