`

浅谈Web缓存

 
阅读更多

在前端开发中,性能一直都是被大家所重视的一点,然而判断一个网站的性能最直观的就是看网页打开的速度。其中提高网页反应速度的一个方式就是使用缓存。一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网络负荷。那么下面我们就来看看服务器端缓存的原理。

 

 

缓存分类

web缓存分为很多种,比如数据库缓存、代理服务器缓存、还有我们熟悉的CDN缓存,以及浏览器缓存。对于太多文字的阅读其实我是拒绝的,于是就画了个图来解释下。

浏览器通过代理服务器向源服务器发起请求的原理如下图,

图片1

浏览器先向代理服务器发起Web请求,再将请求转发到源服务器。它属于共享缓存,所以很多地方都可以使用其缓存资源,因此对于节省流量有很大作用。

浏览器缓存是将文件保存在客户端,在同一个会话过程中会检查缓存的副本是否足够新,在后退网页时,访问过的资源可以从浏览器缓存中拿出使用。通过减少服务器处理请求的数量,用户将获得更快的体验

下面我就来着重讲下传说中的浏览器缓存。

 

浏览器缓存

页面的缓存状态是由header决定的,header的参数有四种:

一、Cache-Control

    1、max-age(单位为s)指定设置缓存最大的有效时间,定义的是时间长短。当浏览器向服务器发送请求后,在max-age这段时间里浏览器就不会再向服务器发送请求了。

我们来找个资源看下。比如shang.qq.com上的css资源,max-age=2592000,也就是说缓存有效期为2592000秒(也就是30天)。于是在30天内都会使用这个版本的资源,即使服务器上的资源发生了变化,浏览器也不会得到通知。max-age会覆盖掉Expires,后面会有讨论。

图片2

 

    2、s-maxage(单位为s)同max-age,只用于共享缓存(比如CDN缓存)。

比如,当s-maxage=60时,在这60秒中,即使更新了CDN的内容,浏览器也不会进行请求。也就是说max-age用于普通缓存,而s-maxage用于代理缓存。如果存在s-maxage,则会覆盖掉max-age和Expires header。

    3、public 指定响应会被缓存,并且在多用户间共享。也就是下图的意思。如果没有指定public还是private,则默认为public。

9

    4、private 响应只作为私有的缓存(见下图),不能在用户间共享。如果要求HTTP认证,响应会自动设置为private。

10

    5、no-cache 指定不缓存响应,表明资源不进行缓存,比如,

图片3

但是设置了no-cache之后并不代表浏览器不缓存,而是在缓存前要向服务器确认资源是否被更改。因此有的时候只设置no-cache防止缓存还是不够保险,还可以加上private指令,将过期时间设为过去的时间。

    6、no-store 绝对禁止缓存,一看就知道如果用了这个命令当然就是不会进行缓存啦~每次请求资源都要从服务器重新获取。

    7、must-revalidate指定如果页面是过期的,则去服务器进行获取。这个指令并不常用,就不做过多的讨论了。

二、Expires

        缓存过期时间,用来指定资源到期的时间,是服务器端的具体的时间点。也就是说,Expires=max-age + 请求时间,需要和Last-modified结合使用。但在上面我们提到过,cache-control的优先级更高。 Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。

11

三、Last-modified 

        服务器端文件的最后修改时间,需要和cache-control共同使用,是检查服务器端资源是否更新的一种方式。当浏览器再次进行请求时,会向服务器传送If-Modified-Since报头,询问Last-Modified时间点之后资源是否被修改过。如果没有修改,则返回码为304,使用缓存;如果修改过,则再次去服务器请求资源,返回码和首次请求相同为200,资源为服务器最新资源。

如下图,最后修改时间为2014年12月19日星期五2点50分47秒

图片4

四、ETag

        根据实体内容生成一段hash字符串,标识资源的状态,由服务端产生。浏览器会将这串字符串传回服务器,验证资源是否已经修改,如果没有修改,过程如下:

12

使用ETag可以解决Last-modified存在的一些问题:

    a、某些服务器不能精确得到资源的最后修改时间,这样就无法通过最后修改时间判断资源是否更新 

    b、如果资源修改非常频繁,在秒以下的时间内进行修改,而Last-modified只能精确到秒 

    c、一些资源的最后修改时间改变了,但是内容没改变,使用ETag就认为资源还是没有修改的。

 

使用缓存流程

还是用图说话,下面是我所总结的从浏览器请求到展示资源的过程:

图片6

 

 

 

cache-control指令使用

说了那么多cache-control的指令,那么如何选择使用哪些指令呢?我还是不说话==

图片5

 

额外的

除了开头提到的那么多缓存方式以外,还有一种我们都熟悉的缓存方式,LocalStorage和sessionStorage(好像是两种23333)。

LocalStorage是一种本地存储的公共资源,域名下很多应用共享这份资源会有风险;LocalStorage是以页面域名划分的,如果有多个等价域名之间的LocalStorage不互通,则会造成缓存多份浪费。

LocalStorage在PC上的兼容性不太好,而且当网络速度快、协商缓存响应快时使用localStorage的速度比不上304。并且不能缓存css文件。而移动端由于网速慢,使用localStorage要快于304。

 

在html中加载一个png图,首次加载的时候时间如下图,

图片7

然而将图片使用了LocalStorage存储后,再次刷新后加载时间为0。

图片8

而相对LocalStorage来说,SessionStorage的数据只存储到特定的会话中,不属于持久化的存储,所以关闭浏览器会清除数据。和localstorage具有相同的方法。

 

在前端开发中缓存是必不可少的,那么使用怎样的缓存方式更高效、让我们项目的性能更优,还是需要我们仔细斟酌。

 

原创文章转载请注明:

转载自AlloyTeam:http://www.alloyteam.com/2016/03/discussion-on-web-caching/ 

分享到:
评论

相关推荐

    web 缓存技术浅谈.

    WEB缓存技术交流,该缓存能够加快网页的访问速度!

    Web应用系统的缓存技术浅谈

    缓存是什么,解决什么问题? Cache是高速缓冲存储器 一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问 凡是位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称...

    缓存技术浅谈

    缓存技术浅谈 基于Web应用的系统架构图 缓存技术分类

    web缓存技术精品课程

    java web缓存技术 ---浅谈系列精品教程

    浅谈HTTP 缓存的那些事儿

    我们为什么使用缓存,是因为缓存可以给我们的 Web 项目带来以下好处,以提高性能和用户体验。 加快了浏览器加载网页的速度; 减少了冗余的数据传输,节省网络流量和带宽; 减少服务器的负担,大大提高了网站的...

    Web应用服务器缓存浅谈PPT

    NULL 博文链接:https://yangtsefisher.iteye.com/blog/786419

    浅谈Ajax请求与浏览器缓存

    在现代Web应用程序中,前端代码充斥着大量的Ajax请求,如果对于Ajax请求可以使用浏览器缓存,那么可以显著地减少网络请求,提高程序响应速度。 1. Ajax Request 使用jQuery框架可以很方便的进行Ajax请求,示例代码...

    浅谈iOS UIWebView对H5的缓存功能

    这两天在搞与H5交互的事,之前做的都是加载的静态的web页面,交互调试起来很快,这次搞的是js写的前端页面,跳转什么的都是动态的,然后就不响应了,搞了半天原来是缓存的问题,这里简单介绍一下,一般请求会使用...

    浅谈Python的Django框架中的缓存控制

    因此,Web 应用程序需要以某种方式告诉缓存那些数据是私有的,哪些是公共的。 解决方案是标示出某个页面缓存应当是私有的。 要在 Django 中完成此项工作,可使用 cache_control 视图修饰器: 例如: from django....

    Rails缓存架构设计

    高性能web应用缓存架构设计浅谈 大规模,高并发的访问请求 服务的高可用性 平滑的deployment 良好的可伸缩性

    浅谈beego默认处理静态文件性能低下的问题

    按道理来说,一个web server框架,静态文件的性能,应该是高于动态文件性能的。 在动态文件性能达到1W/s的情况下,没理由静态文件性能这么低下。 然后查看了一下beego的源代码。发现beego在处理动态文件请求时,有...

    通信与网络中的浅谈可扩展的身份验证协议EAP

    EAP 身份验证方法  使用可扩展的身份验证协议 (EAP),任意身份验证机制都可以对远程访问连接进行身份验证。... 2000 Server 操作系统安全、管理和目录上的 Web 缓存服务器,以实现基于策略的网际访问控制、加

    Javaweb技术文档

    封捷_ModelDriven和Preparable拦截器 张晓飞_Tomcat的设计模式分析 张晓飞_Tomcat系统架构分析 张晓飞_UML模型图 张晓飞_WEB书城. 张晓飞_正则表达式学习手册 ...JNDI原理_张晓飞 ...缓存技术浅谈_张晓飞

    浅谈如何使用 webpack 优化资源

    本片文章中主要是基于 webpack 打包,以 React、vue 等生态开发的单页面应用来举例说明如何从 webpack 打包的层面去处理资源以及缓存,其中主要我们需要做的是对 webpack 进行配置的优化,同时涉及少量的业务代码的...

    ASP.NET3.5从入门到精通

    14.5 Web 服务(Web Service) 14.5.1 什么是Web 服务 14.5.2 Web 服务体系结构 14.5.3 Web 服务协议栈 14.6 简单Web Service 示例 14.7 自定义Web Service 18 第一篇 窗口与界面编程 14.7.1 创建自定义的Web ...

    ASP.NET 3.5 开发大全word课件

    14.5 Web服务(Web Service) 14.5.1 什么是Web服务 14.5.2 Web服务体系结构 14.5.3 Web服务协议栈 14.6 简单Web Service示例 14.7 自定义Web Service 14.7.1 创建自定义的Web Service 14.7.2 使用自定义的Web ...

    ASPNET35开发大全第一章

    14.5 Web服务(Web Service) 14.5.1 什么是Web服务 14.5.2 Web服务体系结构 14.5.3 Web服务协议栈 14.6 简单Web Service示例 14.7 自定义Web Service 14.7.1 创建自定义的Web Service 14.7.2 使用自定义的Web ...

    asp.net知识库

    也谈 ASP.NET 1.1 中 QueryString 的安全获取写法 ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面关键字 网站首页的自动语言切换 应用系统的多语言支持 (一) 应用系统的多语言支持 (二) 自动...

Global site tag (gtag.js) - Google Analytics