一、 什么是缓存

Web 缓存是可以保存文档副本的HTTP设备。

HTTP缓存一般为两种,本地缓存和代理缓存。本地缓存就是客户端设备中的缓存,代理缓存就是缓存代理服务器,常见的就
是 CDN。

二、缓存机制

1. 缓存机制

缓存的机制是针对客户端-缓存设备-源站的交互而言的,缓存的处理机制如下:

缓存机制

如上图所示,一般而言,缓存是否新鲜采用 Cache-Control/Expires 进行判断,也叫做强制缓存。服务器的再验证一般采用 If-None-Match + ETag 或者 If-Modified-Since + Last-Modified 的“条件get”请求来判断,也叫做对比缓存。

2. 本地缓存的特殊之处

当存在多个缓存设备时,比如客户端设备中有缓存,CDN 中也有缓存,此时就有两个缓存了。只要客户端本地有缓存,那么客户端就是一个通常意义上的 Web缓存设备,只不过客户端-服务器的距离几乎为 0 而已。

缓存的概念相当重要,缓存是一个设备。所有缓存相关的逻辑都是按照三个关键点来进行的,这三个关键点就是:客户端、缓存、源服务器,当同时存在客户端缓存和代理缓存时,其情况可能是:

多个缓存设备

  • 本地缓存的特殊之处就在于在判断缓存未失效时可以直接使用缓存而不用发送 Request。

因此,请求一个 HTTP 时,先查询客户端本地的缓存,检查是否有缓存,如果有缓存再根据 Cache-Control: max-age=xxx 来判断缓存是否新鲜,如果足够新鲜,也就是第二次请求在 Cache-Control 时间内,此时可以直接使用本地保存的 Reponse + data,完全不需要进行请求。

如果不够新鲜了,就不能使用本地缓存了,而是应该发起正式的请求。请求到了缓存服务器,缓存服务器会发送带条件的再验证请求到源站,也就是使用 If-Modified-Since 等方法来进行再验证。如果验证通过,缓存未过期,更新 Cache-Control/Expires 的值,重新计算时间,整合 Reponse 之后返回给客户端,返回的实体中不包含 data,此时状态码为 304。如果缓存失效,那么返回的状态码为200,实体中包含全部 data。

其时序图如下:

客户端-本地缓存-代理缓存-源站

三、缓存过期

意义:当存在缓存时,使用过期验证的机制来验证缓存是否可以使用,这一机制也有很多人称之为强制缓存

这一步一般是在本地缓存或者代理缓存中进行,通过 Cache-Control 或者是 Expires 进行验证。

1. Expires

老式的 HTTP1.0协议使用 Expires字段来表示文档的过期日期,比如:

Expires:Thu,15 Apr  2010  20:00:00  GMT

意义:这个字段可以使用一个组件的当前副本,直到指定的时间为止。

缺陷:

  1. 客户端和服务端的时钟必须严格一致;
  2. 时间到期之后服务器需要重新设置;

所以就有了第二种方式:

2. Cache-Control:max-age

Cache-Control:max-age 是对 Expires的优化处理,比如:

Cathe-Control:max-age=315360000

意义:从请求开始在max-age时间都可以使用缓存,之外的使用请求。

如此,就可以消除 Expires 时间统一的限制。

总结:现在强制缓存一般都采用 Cache-Control: max-age=xxx 来设置。

备注:Cache-Control 还有很多其他的可选值,后文会介绍。

四、服务器再验证

意义: 即使缓存过期了,也不意味着缓存文件和原始服务器上的文件不一致,这只是意味着要进行时间核对来确认缓存是否仍然可以使用。这个情况叫做服务器再验证。

验证机制:HTTP 允许客户端向服务器发送一个“条件GET”,根据条件判断,只有当服务器中的文档和缓存不一样时,服务器才会在 Response 主体中包含全部的内容,否则返回 304,Response 中不包含资源。

条件语句有很多种,常用的有两种:

1. If-Modified-Since 和 Last-Modified

If-Modified-Since 客户端使用,在请求头中添加。Last-Modified 服务端使用,在响应头中返回。两个配合使用来验证资源是否真的发生了改变。如果改变了,状态码为200,响应主体中包含所有内容,如果为改变,状态码为304,响应实体中不包含主体,只包含头部。

举个栗子

HTTP缓存机制及其在iOS中的应用相关推荐

  1. 剖析Jive的缓存机制

    Jive是一个广受欢迎的开放源码的论坛项目,虽然推出了很多年,但至今很多Java程序员还对它津津乐道.从框架结构上看,它采用了很多设计模式,如Factory模式.Proxy模式.Decorator模式 ...

  2. HTTP 协议 -- 浏览器缓存机制

    浏览器缓存机制 浏览器缓存机制主要是 HTTP 协议定义的缓存机制. HTTP 协议中有关缓存的缓存信息头的关键字有 Cache-Control,Pragma,Expires,Last-Modifie ...

  3. 【转】MyBatis缓存机制

    转载:https://blog.csdn.net/bjweimengshu/article/details/79988252. 本文转载自公众号 美团技术点评 前言 MyBatis是常见的Java数据 ...

  4. 反思 | Android 音视频缓存机制的系统性设计

    反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 . 背景 在自媒体的时代,音视频播放 俨然已成为内容类型 APP 最基础的能力,对于 Android 开发者而言,无论是 Goo ...

  5. java缓存研究_JAVA缓存研究之剖析Jive的缓存机制内容是什么呢?

    Jive是一个广受欢迎的开放源码的论坛项目,虽然推出了很多年,但至今很多Java程序员还对它津津乐道.从框架结构上看,它采用了很多设计模式,如Factory模式.Proxy模式.Decorator模式 ...

  6. 04ssm_Mybaits关联映射和缓存机制

    04ssm_Mybaits关联映射和缓存机制 文章目录 04ssm_Mybaits关联映射和缓存机制 一.关联映射概述 1.数据表的三种关联映射关系 2.Java描述数据表的关联映射关系 3.本单元实 ...

  7. CDN 缓存机制阐述

    当用户访问一个网站时,客户端直接从源站点获取数据,当服务器访问量大时会影响访问速度,影响用户体验,且无法保证客户端与源站点间的距离足够短,适合传输数据.CDN(内容分发网络),解决的正是如何将数据快速 ...

  8. iOS SDWebImage 缓存机制与缓存策略

    2019独角兽企业重金招聘Python工程师标准>>> 一.SDWebImage 缓存机制 1.基本用法 SDWebImage提供一个UIImageView的Category,用来加 ...

  9. iOS开发缓存机制之—内存缓存机制

    在IOS应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制. 这篇文章将介绍一下如何在iOS设备中进行缓存,本文先介绍一下将内容缓存到内存中,下一篇 ...

  10. iOS教程:详解iOS多图下载的缓存机制

    ios教程,ios的干货一直来不及给大家分享,小编也是一直在忙啊!今天给大家献上ios:详解iOS多图下载的缓存机制 1. 需求点是什么? 这里所说的多图下载,就是要在tableview的每一个cel ...

最新文章

  1. Maven项目配置、检出、运行
  2. oppo手机显示andrOid什么意思,OPPO R17 Pro手机状态栏图标分别代表什么意思?
  3. html设置css字体样式表,HTML 学习笔记 CSS样式(字体)
  4. matlab 多属性权重,多属性决策的权重确定方法及matlab 程序
  5. 浏览器背后的运行机制
  6. 通用技术标模板,技术方案书
  7. 苹果笔记本访问服务器共享文件夹,mac查看win7共享文件怎么操作_mac如何访问win7共享文件夹-win7之家...
  8. Dynamics AX2012 General ledger
  9. Excel使用条件格式
  10. 【机器学习】吴恩达:机器学习的六个核心算法
  11. python3 常用模块_python3-常用模块之re
  12. 计算机视觉入门CV之街道字符识别—01赛题理解
  13. python-函数读取内置函数序列化与反序列化
  14. 中南林业科技大学Java实验报告十二:数据库系统设计 - 从0到1搭建java可视化学生管理系统源代码
  15. c语言while break用法举例,c语言中continue和break的用法
  16. Spell 基于最长公共子序列的在线日志解析方法
  17. 手游代理怎么做?看看这些就知道了
  18. agc38C LCMs
  19. SpaceClaim脚本建模初试(二)
  20. 郭克华手机编程教学视频----我的练习源码(1)MIDlet的生命周期

热门文章

  1. Spring中的Bean可以绕过生命周期管理吗?
  2. JMM同步规范和Volatile重点概要
  3. Linux下安装redis5.0.7
  4. SpringBoot整合RabbitMQ之Topic Exchange通配符交换机(学习总结)
  5. JAVA中public protected default private访问权限
  6. java实战技巧--关于格式化输出日期
  7. C#集成FastDFS断点续传
  8. @objc private 定义函数
  9. python复习第一节
  10. 用adb pull命令从android系统中读取文件失败的原因及解决办法