深入理解http(二)------http的缓存机制及原理

一、概念基础

参考原文:https://blog.csdn.net/hiredme/article/details/73468040

http的缓存,主要存在于本地浏览器和web代理服务器中。 在这里,我们讲的是浏览器缓存。

1.  响应头ETag(Entity Tag)

Etag用来表示一个资源。在服务器返回响应时包含这个值,不同的资源response返回不一样的Etag。在下次请求相同的资源时,浏览器会在 if-None-Match中带着Etag的传给服务器,如果服务器发现Etag和上次相同,直接返回304资源未发生改变,浏览器使用缓存数据。只要资源有变化,Etag就会重新生成。

请求头if-None-Match。if-None-Match表示客户端存取的是该资源的校验值,也就是Etag

  Etag是上一次加载资源时,服务器返回的response header,是对该资源的一种唯一标识,只要资源有变化,Etag就会重新生成。浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到request header里的If-None-Match里,服务器只需要比较客户端传来的If-None-Match跟自己服务器上该资源的ETag是否一致,就能很好地判断资源相对客户端而言是否被修改过了。如果服务器发现ETag匹配不上,那么直接以常规GET 200回包形式将新的资源(当然也包括了新的ETag)发给客户端;如果ETag是一致的,则直接返回304知会客户端直接使用本地缓存即可。

  

  Etag和Last-Modified两者之间对比:
        首先在精确度上,Etag要优于Last-Modified。Last-Modified的时间单位是秒,如果某个文件在1秒内改变了多次,那么他们的Last-Modified其实并没有体现出来修改,但是Etag每次都会改变确保了精度;如果是负载均衡的服务器,各个服务器生成的Last-Modified也有可能不一致。
       第二在性能上,Etag要逊于Last-Modified,毕竟Last-Modified只需要记录时间,而Etag需要服务器通过算法来计算出一个hash值。
       第三在优先级上,服务器校验优先考虑Etag

2.响应头Cache-Control

Cache_-Control主要用来控制缓存相关的东西。Cache-Control头在http 1.1中定义,取代了http1.0版本中用来定义响应缓存策略的头例如(Expires)

缓存指令主要包括:

  1.public  private    public用来声明浏览器和web代理服务器都可以缓存.     private表示仅允许浏览器缓存,代理服务器不允许缓存

  2.no-cache    no-cache不是指不缓存,而是指每次请求资源之前都先向服务器验证该资源是否发生改变

  3.no-store     表示不缓存,即浏览器和代理服务器都不缓存。

  4.max-age     表示缓存的内容在XXX秒后失效。

  5.must-revalidate      使得客户端再次浏览当前页面时必须法送http头信息到服务器进行验证,然后才决定是否加载客户端本地cache

if-modified-since和last-modified的比较

  浏览器在第一次访问资源时,服务器返回资源的同时,在response header中添加 Last-Modified的header,值是这个资源在服务器上的最后修改时间,浏览器接收后缓存文件和header;

    Last-Modified: Fri, 22 Jul 2016 01:47:00 GMT

  浏览器下一次请求这个资源,浏览器检测到有 Last-Modified这个header,于是添加If-Modified-Since这个header,值就是Last-Modified中的值;服务器再次收到这个资源请求,会根据 If-Modified-Since 中的值与服务器中这个资源的最后修改时间对比,如果没有变化,返回304和空的响应体,直接从缓存读取,如果If-Modified-Since的时间小于服务器中这个资源的最后修改时间,说明文件有更新,于是返回新的资源文件和200。

  

二、缓存生效的过程

参考原文:https://www.cnblogs.com/mamimi/p/6900987.html

  服务器收到请求时,会在200OK中返回该资源的Last-Modified和ETag头,客户端将该资源保存在cache中,并记录这两个属性。当客户端需要发送相同的请求时,会在请求中携带If-Modified-Since和If-None-Match两个头。两个头的值分别是响应中Last-Modified和ETag头的值。服务器通过这两个头判断本地资源未发生变化,客户端不需要重新下载,返回304响应。常见流程如下图所示:

 
三、http的缓存机制

参考于:https://www.jianshu.com/p/54cc04190252

    个人对缓存数据失效的理解:个人认为缓存数据失效并不是缓存数据在内存或者磁盘中消失,只是不提供访问,但是它还是真实存在与内存或者磁盘中。

    强制缓存失效:其实就是时间超过Expires或者Cache-Control中的max-age,导致缓存数据失效。

    协商缓存失效:其实就是文件发生改变,Etag发生改变。

强制缓存和协商缓存

  强制缓存:不会向服务器发送请求,直接从浏览器缓存中读取资源。在chrome的控制台的network选项中,可以看到该请求返回200的状态码,并且size显示from disk cache或者 from memory cache。

  from memory cache代表使用内存中的缓存,from disk cache则代表使用的是硬盘中的缓存,浏览器读取缓存的顺序为memory –> disk。在浏览器中,浏览器会在js和图片等文件解析执行后直接存入内存缓存中,那么当刷新页面时只需直接从内存缓存中读取(from memory cache);而css文件则会存入硬盘文件中,所以每次渲染页面都需要从硬盘读取缓存(from disk cache)。

缓存机制工作流程

  在客户端第一次请求数据时,此时浏览器缓存中没有对应的缓存数据,需要请求服务器,服务器返回数据后,将数据存储至浏览器缓存。

第二次请求数据时存在两种情况:

  1.缓存数据失效。

  2.缓存数据失效。

  缓存标识:个人理解为Etag的值。

  协商缓存就是在强制缓存失效后(也就是缓存数据失效后),浏览器带着缓存标识向服务器发起请求有服务器根据缓存标识决定是否使用缓存的过程。主要有以下两种情况:

    1.协商缓存生效,返回304和Not Modified。

    

      2.协商缓存失效,返回200和请求结果

        

 缓存机制的总结

  强制缓存优先于协商缓存进行,若强制缓存(Expires和Cache-Control)生效则直接使用缓存,若不生效则进行协商缓存(Last-Modified / If-Modified-Since和Etag / If-None-Match),协商缓存由服务器决定是否使用缓存,若协商缓存失效,那么代表该请求的缓存失效,返回200,重新返回资源和缓存标识,再存入浏览器缓存中;生效则返回304,继续使用缓存。

  

原文地址:https://www.cnblogs.com/L-C98/p/9181322.html

时间: 2024-08-01 13:48:37

深入理解http(二)------http的缓存机制及原理的相关文章

Java缓存学习之二:浏览器缓存机制

浏览器端的九种缓存机制介绍 浏览器缓存是浏览器端保存数据用于快速读取或避免重复资源请求的优化机制,有效的缓存使用可以避免重复的网络请求和浏览器快速地读取本地数据,整体上加速网页展示给用户.浏览器端缓存的机制种类较多,总体归纳为九种,这里详细分析下这九种缓存机制的原理和使用场景.打开浏览器的调试模式->resources左侧就有浏览器的8种缓存机制. 一.http缓存 http缓存是基于HTTP协议的浏览器文件级缓存机制.即针对文件的重复请求情况下,浏览器可以根据协议头判断从服务器端请求文件还是从

C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制

在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Caching 我理解是在内容中实现,这种方法适用于单服务器的生产环境. 2.a Distributed Cache 分部式缓存实现. 3.Response Cache 这种方式我理解为客户端缓存. 今天我只用了第一种实现方法,内存中缓存,之所以用这种方法我是觉得我这里用缓存的初衷是为了减少访问数据库的次数,

MyBatis学习手记(二)MyBatis缓存机制

MyBatis学习手记二 前:MyBatis官方学习(中文)文档 http://mybatis.github.io/mybatis-3/zh/index.html 一,首先,要使用MyBatis必须使用官方提供的MyBatis的JAR包              链接:https://github.com/mybatis/mybatis-3/releases 这里使用的数据库是MySQL,所以还需要Mysql的驱动包. 二,看MyBatis官方介绍,说MyBatis支持一级缓存,二级缓存.这里才

http缓存机制和原理详解

[背景] http1.1 http1.1 是1997年开始使用的. http是一种协议,用于传输浏览器发送的数据并接收由http server响应的数据. 浏览器就是解释html语言等内容的. http协议构成: request 有client(浏览器)发送 起始行 first line: <method> <url> <version>     as:      GET /ex?i=mm_28347190_2425761_9313994 HTTP/1.1 首部 Hea

彻底弄懂HTTP缓存机制及原理

前言 Http 缓存机制作为 web 性能优化的重要手段,对于从事 Web 开发的同学们来说,应该是知识体系库中的一个基础环节,同时对于有志成为前端架构师的同学来说是必备的知识技能.但是对于很多前端同学来说,仅仅只是知道浏览器会对请求的静态文件进行缓存,但是为什么被缓存,缓存是怎样生效的,却并不是很清楚.在此,我会尝试用简单明了的文字,像大家系统的介绍HTTP缓存机制,期望对各位正确的理解前端缓存有所帮助. 在介绍HTTP缓存之前,作为知识铺垫,先简单介绍一下HTTP报文 HTTP报文就是浏览器

面试总被问到HTTP缓存机制及原理?看完你就彻底明白了

前言 Http 缓存机制作为 web 性能优化的重要手段,对于从事 Web 开发的同学们来说,应该是知识体系库中的一个基础环节,同时对于有志成为前端架构师的同学来说是必备的知识技能. 但是对于很多前端同学来说,仅仅只是知道浏览器会对请求的静态文件进行缓存,但是为什么被缓存,缓存是怎样生效的,却并不是很清楚. 在此,我会尝试用简单明了的文字,像大家系统的介绍HTTP缓存机制,期望对各位正确的理解前端缓存有所帮助. 在介绍HTTP缓存之前,作为知识铺垫,先简单介绍一下HTTP报文 HTTP报文就是浏

深入理解JVM(二)自动内存管理机制

2.1 C.C++内存管理是由开发人员管理,而Java则交给了JVM进行自动管理 2.2 JVM运行时数据区:方法区.堆(运行时线程共享),虚拟机栈.本地方法栈.程序计数器(运行时线程隔离,私有) 2.2.1 程序计数器(Program Counter Register):每一个线程都独有一个程序计数器,并且分配了一块线程私有的小块内存,程序运行时,这个计数器会记录字节码文件运行的行数,当线程切换时,则通过这个行数继续执行下面的操作 2.2.2 虚拟机栈(Java Virtual Machine

HTTP缓存机制与原理

缓存前言 Web缓存大致可以分为:数据库缓存.浏览器缓存.服务器缓存(CDN.代理服务器缓存) 而浏览器缓存也有很多方式,比如:HTTP缓存.localstrong.cookie等,下面将侧重于描述讨论一下HTTP缓存的相关话题. 缓存相对于浏览器来说,我理解的意思让第二次请求同样的数据加载的更快,页面显示更快,减小二次请求给服务器带来的带宽等压力. 浏览器与服务器之间通信是通过HTTP报文发送及响应数据 浏览器--------->服务器,发送请求(request)报文 服务器---------

9大浏览器端缓存机制分析

浏览器缓存(Browser Caching)是浏览器端保存数据用于快速读取或避免重复资源请求的优化机制,有效的缓存使用可以避免重复的网络请求和浏览器快速地读取本地数据,整体上加速网页展示给用户.浏览器端缓存的机制种类较多,总体归纳为九种,这里详细分析下这九种缓存机制的原理和使用场景.打开浏览器的调试模式->resources左侧就有浏览器的8种缓存机制. 一.http缓存 http缓存是基于HTTP协议的浏览器文件级缓存机制.即针对文件的重复请求情况下,浏览器可以根据协议头判断从服务器端请求文件