HTTP -- 缓存

关于缓存
  • 什么是缓存
    缓存这个东西真的是无处不在, 有浏览器端的缓存, 有服务器端的缓存,有代理服务器的缓存, 有ASP.NET页面缓存,对象缓存。 数据库也有缓存, 等等。http中具有缓存功能的是浏览器缓存,以及缓存代理服务器。http缓存的是指:当Web请求抵达缓存时, 如果本地有“已缓存的”副本,就可以从本地存储设备而不是从原始服务器中提取这个文档

  • 为什么要使用缓存
  • 缓存减少了冗余的数据传输,不仅减少了用于流量的费用,还节约了用户的时间。
  • 减轻了服务器的负担,有效的缓存可以可以不需要服务器再重新发送,大大提高了网站的性能。
  • 缓解了网络带宽的问题,不需要更多的带宽就可以更快的加载页面。
  • 降低了距离时延,因为在信息的传播中,距离越长时延越大,缓存可能存在本地或者较近的(代理)服务器上,不需要更远的距离去请求。
  • 缓存的种类
  • 私有缓存
    专用的缓存被称为私有缓存,它不需要很大的动力或者存储空空间,这样就可以做的很小,比较便宜。我们的web浏览器中就有私有内存,它们大多都存在我们电脑的个人磁盘和内存中,并且允许设置大小等。在浏览器的地址输入框和直接F5刷新采用的是不同的机制,前者会查看是否有有效的缓存,有效的缓存会组织请求流向原始服务器,后者会直接询问原始服务器,验证更变

  • 公有缓存
    公有缓存是特殊的共享代理服务器,它会接收来自多个用户的访问,代理缓存会从本地的缓存中提供文档,对于流行的对象缓存只需要取一次就可以了,它会用共享的副本为所有的请求服务,以降低网络的流量。

  • 缓存的处理步骤
  • 接收
    缓存从网络中读取抵达的请求报文

  • 解析
    缓存对报文进行解析,提取URL和各种首部。

  • 查找
    缓存查看是否有本地副本可用,如果没有,就获取一份副本(并将其保存到本地)。

  • 缓存无法保存世界上的每份文档,当可以用已有的副本为某些到达缓存的请求提供服务时成为缓存命中,从而衍生出缓存命中率和字节命中率等概念。其他一些到达缓存的请求可能会由于没有副本可用被转发给原始的服务器,这称为未命中。
    再验证:原始服务器的内容很可能发生变化(下面的新鲜度检测会详细讲解)缓存要不时的对其进行检测,这个过程并不需要从服务器获取整个对象,就可以快速检测。在项目的开发中也有可能因为缓存的问题使我们原本的改动无法呈现。
  • 新鲜度检测
    缓存查看已缓存副本是否足够新鲜,如果不是,就询问服务器是否有任何更新。(首部自身都可以强制缓存的验证)
  • 文档过期,通过特殊的HTTP Cache-Control首部和Expires首部,来标记文档的“保质期”。
  • 服务器再验证
    仅仅是已缓存文件过期了并不意味着它和原始服务器上目前处于活跃状态的文档有实际的区别,只是说到了要审核的时间了,说明缓存需要访问原始服务器是否发生了变化。如果发生了变化,缓存会获取一份新的文档副本,并且将其存到旧的文档的位置上;如果没有发生变化,缓存只需要获取新的首部,包括一个新的过期日期,并对缓存中的首部进行更新。
    • 用条件方法进行验证
    1. If-Modified-Since:Data

      指定日期或者时间,如果从指定日期之后文档修改过了就执行请求方法。可以与Last-Modofied服务器响应首部配合使用,只有内容在被修改过以后与已缓存版本有所不同时才会获取内容(注意:这里不一定是以后而是有不同就获取)。如果“过期”通常GET就会执行成功,携带新首部的文档会被返回给缓存;如果“未过期”则只返回一个新的过期日期。

    2. If-None-Match:实体标签再验证
      与上面不同,这个方法是通过一个额外的标签来识别版本(附加到文档上的任意标签或者引用字符串),因为在某些情况下仅仅使用上面的方法是不够的,例如:有些文档会周期性的修改但是包含的数据是一样的,有些数据可能被修改了但是这个修改并不是很重要;有些服务器无法获取到修改时间等。
    3. 弱验证器
  • 创建响应
    缓存会用新的首部和已缓存的主题来构建一条响应报文。
  • 发送
    缓存通过网络将响应发回客户端
  • 日志
    缓存可选地创建一个日志文件条目来描述这个事务。
  • 设置缓存控制不同的web服务器为HTTP Cache-control 和 Expiration 首部的设置提供了一些不同的机制
  • 控制Apache的HTTP首部
    Apache Web 服务器提供了几种设置HTTP缓存控制首部的机制,其中很多机制需要人为启动。
  • mod_headers
    通过这个模块可以单独对首部进行设置(设置单个HTTP首部指令来扩充Apache的配置文件),下面是将文件都标识为非缓存的实例:
    <Files *.html> Header set Cache-control on-cache </Files>
  • mod_expries
    它提供的程序逻辑可以自动生成带有正确过期日期的Expires首部,通过模块为文件设置过期日期和缓存能力。
  • mod_cern_meta
  • 相关内容推荐