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

为什么要进行web缓存

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

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

缓存服务器

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

新鲜度

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

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

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

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

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

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

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

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

缓存设置
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.命中计数

HTTP缓存剖析的更多相关文章

  1. Redis分布式缓存剖析及大厂面试精髓v6.2.6

    概述 官方说明 Redis官网 https://redis.io/ 最新版本6.2.6 Redis中文官网 http://www.redis.cn/ 不过中文官网的同步更新维护相对要滞后不少时间,但对 ...

  2. Http 缓存剖析

    缓存一直是前端优化的主战场, 利用好缓存就成功了一半. 本篇从http请求和响应的头域入手, 让你对浏览器缓存有个整体的概念. 最终你会发现强缓存, 协商缓存 和 启发式缓存是如此的简单. 导读 浏览 ...

  3. 剖析OkHttp缓存机制

    现在应用市场上的 App 无一不需要网络操作,这些应用的开发者大多数都选择结合使用 OkHttp 和 Retrofit 来完成网络操作.okHttp 最为人称道的一个特性就是它的缓存机制,而我将在本篇 ...

  4. WCF技术剖析之八:ClientBase<T>中对ChannelFactory<T>的缓存机制

    原文:WCF技术剖析之八:ClientBase<T>中对ChannelFactory<T>的缓存机制 和传统的分布式远程调用一样,WCF的服务调用借助于服务代理(Service ...

  5. taobao-pamirs-proxycache开源缓存代理框架实现原理剖析

    写在前面 taobao-pamirs-proxycache 是一款开源缓存代理框架, 它将 缓存代码 与 业务代码 解耦.让开发专注coding业务, 缓存通过xml配置即可实现.本文先从此工具如何使 ...

  6. 全面剖析Smarty缓存机制一[三种缓存方式]

    今天主要全面总结下Smarty模板引擎中强大的缓存机制,缓存机制有效减少了系统对服务器的压力,而这也是很多开发者喜欢Smarty的原因之一,由于篇幅较大,便于博友阅读,这篇文章将剖析Smarty缓存的 ...

  7. HDFS集中式的缓存管理原理与代码剖析--转载

    原文地址:http://yanbohappy.sinaapp.com/?p=468 Hadoop 2.3.0已经发布了,其中最大的亮点就是集中式的缓存管理(HDFS centralized cache ...

  8. HDFS集中式的缓存管理原理与代码剖析

    转载自:http://www.infoq.com/cn/articles/hdfs-centralized-cache/ HDFS集中式的缓存管理原理与代码剖析 Hadoop 2.3.0已经发布了,其 ...

  9. Mybatis架构原理(二)-二级缓存源码剖析

    Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...

随机推荐

  1. spring boot密码管理

    1.引入依赖 <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId> ...

  2. idea关闭自动更新

    如何关闭idea的自动更新? File-Setting-Appearance&Beha-System Setting-Updates 取消勾选Automatically check updat ...

  3. Blender建模与游戏换装(转载文)

    本文转载自https://my.oschina.net/huliqing/blog/880113?hmsr=toutiao.io 如果本文涉及侵权行为,请原作者联系博主邮箱,我将及时进行删除处理 博主 ...

  4. C学习笔记-gcc

    GNU CC(通常称为GCC)是GNU项目的编译器,它能够编译C.C++语言编写的程序 gcc的优点 使用gcc,程序员可以控制生成二进制执行文件中调试代码的数量和类型. 和其他编译器一样,gcc也可 ...

  5. CentOS7修改内核启动顺序

    CentOS7修改内核启动顺序: 1.首先查看当前系统有几个内核 cat /boot/grub2/grub.cfg |grep menuentry   2.查看当前默认内核 grub2-editenv ...

  6. adb工具介绍与安装

    一天笑嘻嘻是一名测试人员,想了解Android的测试方法,于是,就找到了小测试. 笑嘻嘻:身为一名测试人员需要了解ADB的哪些内容? 小测试:了解原理和简单的命令使用就可以了. 笑嘻嘻:你有毒啊,都了 ...

  7. CDH6.2安装之离线方式

    参考: https://www.cnblogs.com/swordfall/p/10816797.html 下载parcels: https://archive.cloudera.com/cdh6/6 ...

  8. 查找担保圈-step3-获取担保圈路径

    USE [test] GO /****** Object: StoredProcedure [dbo].[p01_get_group_path] Script Date: 2019/7/8 14:40 ...

  9. python的学习之路(四)

    #迭代器,取值只能用next方法,不能随意取值name = iter([11,22,33,44])print(name.__next__())print(name.__next__())print(n ...

  10. 【图论好题】ABC #142 Task F Pure

    题目大意 给定一个 $N$ 个点 $M$ 条边的有向图 $G$,无重边.自环.找出图 $G$ 的一个导出子图(induced subgraph) $G'$,且 $G'$ 中的每个点的入度和出度都是 1 ...