前端Http协议缓存初解

[TOC]

简介

用户获取网络资源,需要通过非常长的网络去服务器上请求资源,另外服务端为了应对大量的用户请求而不断的提升硬件性能与带宽。这对用户与服务端都非常的不友好。而缓存就是为了解决用户请求速度与释放服务器压力而生的。

为什么我会写Http缓存,因为下面介绍的缓存都是通过Http定义的。浏览器缓存则是另外的如:SessionStorage,LocalStorage(个人见解)。

缓存的判断规则

1. 过期机制

过期机制就是浏览器根据缓存的有效期进行判断,如果在有效期内就使用缓存,否则就抛弃这个缓存。

一个缓存副本必须满足以下条件,浏览器会认为它是有效的,足够新的:

    1. 含有完整的过期时间控制头信息(HTTP协议报头),并且仍在有效期内;

    2. 浏览器已经使用过这个缓存副本,并且在一个会话中已经检查过新鲜度;

2. 验证机制

浏览器带上本地缓存副本的验证信息提交给服务器(Last-Modified,ETag),由服务器决定是否采用这个缓存。

客户端请求的时候带上Last-Modified,服务器进行验证返回If-Modified-Since来确定资源是否是有效缓存。
另外在控制头信息带上这个资源的实体标签Etag(Entity Tag),它可以用来作为浏览器再次请求过程的校验标识。如过发现校验标识不匹配,说明资源已经被修改或过期,浏览器需求重新获取资源内容。

缓存来源

1. from disk cache

此资源是从磁盘当中取出的,也是在已经在之前的某个时间加载过该资源,不会请求服务器但是此资源不会随着该页面的关闭而释放掉,因为是存在硬盘当中的,下次打开仍会from disk cache。

2. from memory cache

字面理解是从内存中,其实也是字面的含义,这个资源是直接从内存中拿到的,不会请求服务器一般已经加载过该资源且缓存在了内存当中,当关闭该页面时,此资源就被内存释放掉了,再次重新打开相同页面时不会出现from memory cache的情况。

3. 请求来源

当http状态为200是实实在在从浏览器获取的资源,当http状态为304时该数字是与服务端通信报文的大小,并不是该资源本身的大小,该资源是从本地获取的。

缓存类型

强缓存

1. Expires

服务器发送给客户端一个UTC时间(如 expires: Thu, 19 Nov 2019 08:52:00 GMT),浏览器接收到了这个头,就会为这个资源标记一个过期时间,在下次的请求时候判断未过期会直接使用这个资源缓存。来源会标记为from disk cache

浏览器在取到这个缓存资源的时候,会用客户机的时间与之对比,如果还在有效期内,则直接使用这个缓存,不进行网络请求。否则会进入其他缓存依据判断。

而这个机制会有一个问题,就是,缓存资源是否过期依赖客户机时间。客户机可以通过修改当前时间来使这个缓存资源失效

2. Cache-Control

HTTP/1.1定义的 Cache-Control 头用来区分对缓存机制的支持情况, 请求头和响应头都支持这个属性。通过它提供的不同的值来定义缓存策略。

2.1 max-age

示例:

Cache-Control: max-age=100

这个示例表示,这个缓存资源在本次请求后的100秒之后都有效。浏览器会直接返回from disk cache,不进行网络资源请求。

2.2 no-cache

示例:

Cache-Control: no-cache

这个示例表示,这个缓存资源不进行强缓存校验,需要通过服务端的协商缓存判断是否启用。

协商缓存

1. Last-Modified,If-Modified-Since

当客户端访问资源时,服务器会将资源最后修改时间通过 Last-Modified 标识由服务器发往客户端,客户端记录修改时间,再次请求本地存在的缓存资源时,客户端会通过 If-Modified-Since 头将先前服务器端发过来的最后修改时间戳发送回去,服务器端通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回新的内容,如果是最新的,则返回304告诉客户端其本地缓存资源是最新的。

2. ETag

服务器为一个资源生成一个唯一的id值,一旦资源在服务端发生了改变则会重新生成一个tag,客户端请求资源时,带上了这个etag,如果不一致,服务端将会发送最新的资源给用户,否则重定向304直接使用缓存资源。

浏览器缓存判断流程

Alt text

参考文章

https://www.yodfz.com/detail/...
https://www.cnblogs.com/slly/...
https://blog.csdn.net/qq_3205...
https://blog.csdn.net/charlen...
https://segmentfault.com/a/11...
http://www.cnblogs.com/li0803...
https://developer.mozilla.org...
https://blog.csdn.net/alan199...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解java访问修饰符

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

企业为什么要做SEO,它的重要性有哪些?

对于SEO工作而言,我们知道一个网站做SEO的基础诉求就是让用户和搜索引擎更好的理解网站内容,虽然随着搜索引擎算法技术的迭代,目前SEO面临更大的挑战与竞争,但基于搜索营销,它目前仍然显得十分重要。 那么&#xff0…

白话说编程之java线程

白话说编程之java线程线程和进程:进程:线程:线程和进程的区别:详解多线程:并发为什么使用并发并发的执行原理并行线程的五种状态:创建状态:就绪状态:运行状态:阻塞状态:死…

powerdesigner显示工具面板_photoshop教程-画笔工具预设与选项设置

定义画笔预设在打开的“画笔”面板中,单击左侧的“画笔笔尖形状”名称,可显示笔尖形状图案。单击“画笔”面板左侧其他不同的选项名称,在右侧就会显示其对应的调节项。只单击不同选项前面的方框,可使此选项有效,但右侧…

深入理解== 和 equals 的区别

深入理解 和 equals 的本质区别简介区别:图解:注意点:源码分析:总结分享一波:程序员赚外快-必看的巅峰干货简介 初学者常常被" “和‘equals ’所折磨,为什么,因为他们的大概意思相同,都是…

java sleep和wait区别

为什么80%的码农都做不了架构师?>>> 关于sleep和wait区别解析: sleep只是释放CPU资源,并不释放资源锁对象,wait是会释放掉资源锁对象。 比如,有个锁对象object,线程1和线程2都会锁住object对象…

深入理解equals和hashCode关系和区别

深入理解equals和hashCode关系和区别直入主题:区别:1.他们判断对象相同的方式不一样:2.他们判断对象是否相等的准确率不一样:改写equals时总是要改写hashcode分享一波:程序员赚外快-必看的巅峰干货为什么要说equals和hashCode这两…

Jdk 和 jre 的 关系和区别

Jdk 和 jre 的 关系和区别 区别: JDK:是Java Development Kit 的简称–>翻译过来就是:Java 开发工具包。是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。 JRE:是Java Runtime Environm…

OpenCV-Python入门教程7-PyQt编写GUI界面

前面一直都是使用命令行运行代码,不够人性化。这篇用Python编写一个GUI界面,使用PyQt5编写图像处理程序。包括:打开、关闭摄像头,捕获图片,读取本地图片,灰度化和Otsu自动阈值分割的功能。 使用Qt Designer…

spark 广播变量大数据_大数据处理 | Spark集群搭建及基本使用

点击蓝字关注我前面用了一篇文章详细的介绍了集群HDFS文件系统的搭建,HDFS文件系统只是一个用于存储数据的系统,它主要是用来服务于大数据计算框架,例如MapReduce、Spark,本文就接着上一篇文章来详细介绍一下Spark集群的搭建及Spa…

如何将本地项目上传到gitee

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

oracle dg 备库未设置convert参数导致ORA-01111,ORA-01110

2019独角兽企业重金招聘Python工程师标准>>> 查看trace 文件: MRP0: Background Managed Standby Recovery process started (amls) started logmerger process Sun Jan 20 07:55:53 2019 Managed Standby Recovery starting Real Time Apply MRP0: Back…

VMware安装虚拟机并使用NAT模式连接网络

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

PHPStudy下Apache SSL证书安装教程

一、安装SSL证书的环境 Apache安装目录:E:phpStudyPHPTutorialApache 以上为windows下测试SSL证书安装的目录,具体目录请根据自己的实际环境! 二、获取SSL证书 成功在沃通申请SSL证书后,会得到一个压缩包文件,解压后得到四个文件&…

中国官方要求进一步加强中资商业银行境外机构合规管理

中新社北京1月22日电 (记者 王恩博)为推动在境外设有经营性机构的中资商业银行进一步优化集团合规管理体系,健全跨境合规管理机制,提高跨境合规管理有效性,实现境外机构安全稳健运行,中国银保监会22日发布《关于加强中资商业银行境…

详解:设计模式之-代理设计

分享一波:程序员赚外快-必看的巅峰干货 概念 通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理(类似于AOP)。 代理设计模式应用场景:AOP、权限控制、事务 常见代理的分类有&am…

【实时+排重】摆脱渠道统计刷量作弊行为

如今的渠道统计不仅要看精准度,更要看数据的真实性。 对App的推广业务而言,渠道监测和统计是必不可少的环节,不论以什么形式开展推广,终究都要具体落实到App的安装量、激活量等指标上。但在如今数据刷量和作假行为横行的背景下&am…

详解:设计模式之-单例设计模式

分享一波:程序员赚外快-必看的巅峰干货 前言 近期预计1-2周左右会更新设计模式专题文章。 单例设计模式:保证在一个JVM中,只能存在一个实例。 应用场景:Servlet,Spring IOC,线程池,连接池,S…

详解:设计模式之-适配器模式

分享一波:程序员赚外快-必看的巅峰干货 简介 在设计模式中,适配器模式有时候也称包装样式或者包装。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。 分类 …