资讯专栏INFORMATION COLUMN

HTTP缓存剖析

Harriet666 / 2191人阅读

摘要:如果从指定日期之后文档被修改过,就执行请求方法,可以与服务器响应首部配合使用,只有在内容被修改后与已缓存的版本不同的时候才去获取内容。

web浏览器会自动缓存访问过的页面,当访问同一个页面的请求时,浏览器不再从服务器中重新下载页面而是优先使用本地缓存中的页面

为什么要进行web缓存

从用户的角度来看web缓存加快了上网速度,当然这是用户主观认为的增加了上网速度,从设计者的角度来看:
1.网络带宽的限制,也就是说在单位时间内,用户从网络上获取的信息是有着上限的,这就限制了用户的上网速度,而缓存可以造成一种加快上网速度的假象;
2.缓存可以有效的减少网络冗余信息的传输,即同一个页面如果用户每个一段时间就刷新一次,服务器中的页面并没有发生变化,如果用户每刷新一次服务器就传送一个新的页面这就造成了数据的冗余;
3.缓存可以有效地削弱瞬间拥塞现象;瞬间拥塞可能造成整个网络和服务器的崩溃;

虽然缓存有着种种好处,但是缓存并不是简简单单地在本地存储一个页面,缓存首先要面对的一个现实问题即网络上有海量的页面,总不能都缓存吧;为了解决这个问题,提出了缓存命中的概念(缓存命中这个概念显然是一个舶来品)所谓的缓存命中是指当一个请求所需的页面在本地缓存中,并且经过检测缓存的页面并没有在服务器发生变化,浏览器将使用本地缓存的页面(缓存页面的再检测也称为缓存页面的保鲜度,当浏览器发现所需的页面在本地缓存中,为了确定页面是否是最新的页面时,浏览器将向服务器发送一个请求询问页面是否是最新的,最新的依据就是页面的最后修改时间,若服务器发现页面是最新的,则返回一个应答,若发现页面不是最新的将会把最新的页面发送给浏览器)

缓存服务器

若将缓存多带带地存放在一个服务器中,就形成了缓存服务器,缓存服务器的拓扑结构多种多样,有层次结构、网状结构和对等结构等,但是缓存服务器的处理流程基本相同:

新鲜度

页面总是可能随时间发生变化的,那如何保证页面总是最新的那?http协议提供文档过期时间和服务器再验证;
文档过期时间:

cacahe-control:maxAge/文档的相对过期时间

Expire: /文档的绝对过期时间

相对过期时间相对于绝对过期时间更好一些,因为绝对过期时间依赖于计算机时钟的本地设置;

服务器再验证
当文档的到期时间到了,但并不能说明文档在服务器端也发生了变化,因此此时就需要浏览器向服务器进行再验证,注意当服务器已经挂掉了,而缓存又需要验证,缓存就要返回一条错误信息;

条件验证
Http允许缓存向原始服务器发送一个条件get,将新鲜度检测和获取对象合并成一个get请求,请求服务器只有在文档和缓存的文档不一致时才会返回新的文档。

If-Modified-Since: 如果从指定日期之后文档被修改过,就执行请求方法,可以与last—Modified服务器响应首部配合使用,只有在内容被修改后与已缓存的版本不同的时候才去获取内容。

If-None-Math:服务器可以提供特殊的标签,而不是将其与最近的修改日期相匹配,这些标签就像序列号一样,如果已缓存的标签和服务器的标签不同,则执行请求的方法,返回新的内容。

缓存设置
cache-control:no-store表示不再缓存中缓存文档
cache-control:no-cache表示可以在本地缓存文档,但在新鲜度检测之前不得返给浏览器,不管文档是否过期;
cache-control:maxage表示文档的最大缓存时间
Expire:表示文档的过期时间
cache-control:must-revaildate表示在文档过期后,必须进行新鲜度检测后才能返回给浏览器

探测性过期算法:
如果未设置cache-control,且文档有缓存线索即最后修改日期,浏览器可以运行探测性算法计算出一个大概的日期,其中LM-Factor算法如下:

   新的过期日期=server_date+(server_date-last_modified_time)*factor
   server_date:缓存和服务器会话时间
   factor:比例数

广告商的困劲

1.缓存清楚
2.缓存日志
3.命中计数

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/52040.html

相关文章

  • 深入剖析浏览器缓存策略

    摘要:浏览器缓存只存在于每个单独的客户端,因此它是私有缓存。表示该资源既能被浏览器缓存,也能被任何中间人比如代理服务器等缓存。普通刷新会启用协商缓存,忽略强缓存。只有在地址栏或收藏夹输入网址通过链接引用资源等情况下,浏览器才会启用强缓存。 前言 在访问一个网页时,客户端会从服务器下载所需的资源。但是有些资源很少发生变动,例如 HTML、JS、CSS、图片、字体文件等。如果每次加载页面都从源服...

    Cympros 评论0 收藏0
  • Volley源码剖析

    Volley is an HTTP library that makes networking for Android apps easier and most importantly, faster. Volley是Google在2013年推出来的HTTP库,旨在帮助开发者更快更简便的实现网络请求。说说为什么要分析Volley的源码吧,因为Volley中线程的转换时通过 Thread 和 Ha...

    番茄西红柿 评论0 收藏0
  • spring boot - 收藏集 - 掘金

    摘要:引入了新的环境和概要信息,是一种更揭秘与实战六消息队列篇掘金本文,讲解如何集成,实现消息队列。博客地址揭秘与实战二数据缓存篇掘金本文,讲解如何集成,实现缓存。 Spring Boot 揭秘与实战(九) 应用监控篇 - HTTP 健康监控 - 掘金Health 信息是从 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring...

    rollback 评论0 收藏0

发表评论

0条评论

Harriet666

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<