缓存初探

我发现我每次写博客都不太会开头,这里从网络请求三步骤开始吧:请求、处理、响应。

前端缓存主要是在“请求”和“响应”中进行。在请求步骤中,浏览器通过缓存能减少发送请求次数;在响应步骤中,浏览器和服务器相互配合,通过减少响应的内容从而减少传输时间

缓存位置优先级由上至下:

Service worker

memory cache

disk cache

网络请求:

从Chrome开发者工具的Network —> size一栏可以看到请求处理方式:

  • 如果是显示数字,几k或者几M,则是表示是从网络传输的
  • 其他的则是from ServiceWorker,from memory cache,from disk cache

Service worker:是浏览器在后台独立于网页运行的脚本,类似于一个中间人,浏览器发出的请求都会被Service Worker拦截并被它处理。当有Service Worker时,浏览器会优先从Service Worker读取缓存。

memory cache是短期存储,页面刷新时通常是从内存中获取缓存;页面关闭,缓存就失效了,从内存中获取缓存比从硬盘中获取速度快。几乎所有的请求资源都能进入memory cache。浏览器为了加快读取缓存速度而进行的自身的优化行为,不受开发者控制也不受HTTP协议的约束。

从memory cache获取缓存内容时,浏览器会忽视max-age=0,no-cache等头部配置,如果完全不想让一个资源进入缓存,需要使用no-store。

disk cache是存在硬盘中的缓存,当页面关闭后再次打开时读取的就是硬盘缓存。

disk cache(HTTP cache)包括强制缓存(强缓存)和协商缓存(对比缓存):首先进行强制缓存,如果强缓存失效,需要使用对比缓存,由服务器决定缓存内容是否失效。

强制缓存:

当命中强制缓存时,浏览器不会去请求服务器,而是直接使用本地缓存资源,并返回200

强制缓存直接减少请求数,是提升最大的缓存策略

是否命中强制缓存是由头中的expirescache-control控制的。

1、 expires是HTTP1.0时的标准,是表示服务器的过期时间,是格林威治时间,绝对时间。当请求的时候客户端的时间超过expires标识的时间时就会去请求服务器。

2、  但是expires存在的问题是:当用户手动修改了这个时间就会有问题

3、  Cache-control是HTTP1.1的产物,可以看作expires的补充

4、 判断缓存是否过期的步骤:看是否有cache-control的max-age;如果没有则用expires作为过期时间比较

Cache-control常用值:

  • Max-age:缓存的最大有效时间,会覆盖expires。不经常更新的资源一般会设置一个很大的值,例如:3453600。
  • S-maxage:如果该值存在,则会优先使用它作为CDN的缓存时间
  • Public:表明响应可以被任何对象包括客户端、服务器缓存
  • Private:只能是发起请求的浏览器进行缓存
  • No-cache:仍然对资源使用缓存,每一次在使用缓存之前必须向服务器对缓存资源进行验证
  • No-store:所有内容都不会被缓存,即不是用强制缓存也不使用协商缓存
  • Must-revalidate:如果配置了max-age,如果超过max-age的时间,即需要对资源的有效性进行验证

max-age=0和no-cache在浏览器反应上是没有差别的,两者的区别在于:

max-age=0在语义上被理解为:到期应该(should)重新验证

no-cache:必须(must)重新验证

协商缓存:

需要与服务器协商是否使用缓存,命中协商缓存会返回304

协商缓存由响应头中的Last-Modified和ETag + 请求头中的If-Modified-Since和If-None-Match控制

优化点在于:响应体积上的节省,通过减少响应体体积来缩短网络传输时间。对比缓存在请求数上和没有缓存是一样的,但是如果是304返回的仅仅是一个状态码,没有实际的内容

Response:Last-Modified + Request:If-Modified-Since

服务器通过传回Last-Modified这个数据告诉浏览器资源最后一次被修改的时间

浏览器将这个Last-Modified值和资源存到缓存数据库中,当再次请求相同的资源时浏览器会将上次Last-Modified值写入到If-Modified-Since中传回服务器,服务器通过对比Last-Modified和If-Modified-Since两个值是否一致,如果一致就返回304,表示资源未被修改;如果两个值不一致说明服务器中该资源被更新,则返回200和新的资源

Response:ETag + Request:If-None-Match

整个流程同(Response:Last-Modified + Request:If-Modified-Since)只不过ETag是文件的特殊标识,由服务器生成。

ETag的优先级高于Last-Modified。同理,服务器也会优先验证If-None-Match

补充一个 CDN缓存:

CDN(Content Delivery Network)内容分发网络

采取与强制缓存相似的机制,把CDN看成是浏览器,把源服务器看成是浏览器需要请求的服务器,此时,源服务器的max-age头决定了资源在CDN节点本地缓存的时间,如果s-maxage存在,则会优先使用s-maxage

参考文章:

一文读懂前端缓存

扒一扒浏览器缓存机制

原文地址:https://www.cnblogs.com/ningyn0712/p/11929408.html

时间: 2024-10-03 23:28:02

缓存初探的相关文章

ibatis缓存初探(1)

一,IBATIS 缓存机制使用 1,sqlMapConfig.xml中配置 1.SqlMapConfig.xml中 <settings cacheModelsEnabled="true" //设置为true enhancementEnabled="true" lazyLoadingEnabled="true" ............. /> 注意点,k,必须配置settings这个标签,否则 Xml代码 cacheModelsEna

SpringCache缓存初探

body,table tr { background-color: #fff } table tr td,table tr th { border: 1px solid #ccc; text-align: left; padding: 6px 13px; margin: 0 } pre code,table,table tr { padding: 0 } hr,pre code { background: 0 0 } body { font: 16px Helvetica, Arial, san

MyBatis结果映射与MyBatis缓存初探学习记录

MyBatis高级结果映射(一对一.一对多.多对多的映射),延迟加载,查询缓存(一级缓存),二级缓存的学习记录: 1.学习中所使用到的例子,数据库基础分析 2.高级结果映射 3.延迟加载 4.一级缓存 5.二级缓存 1.学习中所使用到的例子,数据库基础分析 2.高级结果映射 resultType与resultMap: resultType来进行结果映射,数据库中查询几条记录,那么在resultType就会映射成几条记录:resultType映射是一个平铺式的映射: resultMap比较繁琐一些

图片内容缓存技术。

在Android加载网络图片一章中当滚动屏幕时会不但调用异步任务重新加载图片,这样即浪费网络资源用户体验也不好,那么我们可以将图片缓存起来,要显示时先从缓存获取.图片缓存的实现分为两种一种内存缓存,一种文件缓存. 内存缓存Google已经帮我们实现,通过LruCache你可以非常方便快速的实现内存缓存. 先简单了解下LruCache原理,Lru是最近最少使用的意思,要做内存缓存首先需要定义缓存空间大小,当缓存空间不够时,系统回收部份内存空间,回收依据是什么呢,这里采用的便是Lru算法,将最近最少

Android动态绘图实现

一直想实现一个动态绘图的功能,就是那种给定几张图片之后一张张的顺序画出来.说不明白,先上效果图. 这样可以做很多东西,像百度地图的历史轨迹绘制,引导界面做类似动画效果等. 之前我考虑用SurfaceView实现这个功能,想一想,要实现这种效果,需要开启一个子线程用于控制绘制时间间隔,以达到这种渐渐绘制的效果.动手去做了,发现用SurfaceView很难实现,SurfaceView中的Canvas与View中的Canvas不同,一个不同之处是View中的Canvas是只有一张画布,然后不停的在这张

Nginx作为动静分离、缓存与负载均衡初探

一.概述: 我之前有一篇文章写了Nginx作为web服务器的http与https的初探作为nginx基础介绍,作为web服务器使用;今天要介绍的是nginx作为代理服务器和负载均衡服务器的入门介绍;实现内容:通过nginx代理后端phpadmin网站,并通过nginx的代理达到动静内容分离; 实验环境:proxy:Centos7 模拟外网ip:172.16.3.152 内网Lan ip:192.168.56.254后端静态节点n1.pkey.cn:CentOS7 内网Lan ip:192.168

Hibernate 缓存机制初探

1.缓存简述 Hibernate缓存分两级缓存 一级session缓存,就是常说的一级缓存:二级应用缓存(二级缓存): 一级缓存,一级缓存依赖于session,在一个session中就是一个缓存,当session失效时,缓存消失. public void loadBookAgain(){  Session session = HibernateSessionFactory.getSession();  Book book1 = (Book) session.get(Book.class, 6);

802.11协议精读9:初探节能模式(PS mode)以及缓存机制

序言 由于802.11的协议工作机制,如果其一种处于工作状态下,那么能耗还是比较大的,尤其移动设备的电量有限,所以在802.11协议初期就设计了相应的能耗管理机制,即引入了节能模式.本文我们主要讨论一下其节能模式的一些基本思想和相应的组件.对于具体的MAC层工作机制,我们在后续的文章中在进行展开. 注:本文初始的意图是描述在节能模式下具体的MAC层工作机制,不过后来在写缓存结构的时候,发现内容整理还是较多,所以进行分拆.故在本文中,我们主要描述了802.11协议中,节能的基本思想,以及其所添加的

java初探(1)之缓存技术

页面缓存的原理: 普通要想生成一个页面,需要该页面在springboot的templates目录下,然后通过springboot的内部渲染,视图解析器将页面渲染回客户端,这中间会花费很长的时间. 但如果将整个页面的代码转化为字符串,存到redis中,当请求一个页面时,通过ResponseBody注解,将该字符串直接返回,由客户端自己渲染成页面,那么服务器的压力就会小很多,有效的解决并发. 存在的问题: 需要合理设置redis缓存的时间,如果设置时间太长,会导致当页面数据本该变化的时候却没有改变,