Web缓存和静态化

目录

Web缓存基础... 1

什么是Web缓存... 1

Web缓存的类型... 1

为何要使用Web缓存... 1

重验证... 1

更新... 2

浏览器缓存... 2

工作机制... 2

一:文档过期时间... 2

二:执行重验证... 3

浏览器缓存控制... 3

如何主动通知浏览器缓存失效... 5

反向代理服务器缓存... 5

Varnish缓存... 5

Web应用对页面的缓存... 6

Web应用对页面的缓存... 6

静态化... 7

什么是静态化... 7

为何需要静态化... 7

静态化分类... 7

实现真正静态化... 7

静态化的一些说明... 7

Web缓存基础

什么是Web缓存

Web缓存指的是从发起请求的客户端,到执行功能的web服务器之间的,用来保存服务器输出结果的副本,并提供给发起请求的客户使用,这样的一些缓存的统称。

Web缓存的类型

1:浏览器缓存

2:CDN(Content Delivery Networks)

3:反向代理服务器缓存

4:Web服务器端的缓存,通常是应用程序来实现的动态页面缓存

为何要使用Web缓存

1:加快Web应用响应速度,提高用户满意度

2:减少服务端的处理压力,以同样的资源来支撑更大的访问量和高并发

重验证

通常存放在缓冲中的内容是有时效性的,因此需要经常对缓存中的内容做有效性检查,也叫“重验证”。

更新

更新操作主要是为了保证缓存中的内容与服务器中的内容保持一致

浏览器缓存

工作机制

浏览器缓存主要是通过在Http头部增加:Last-Modified,If-Modified-Since,Expires,Cache-Control等标识,和服务器进行协商,以确定是否采用浏览器的缓存。

Http中的更新途径:定义文档过期时间、执行重验证

一:文档过期时间

1:在服务端返回的Http头设置:Expires

2:在服务端返回的Http头设置:Cache-Control:max-age

3:同时具有的时候,max-age具有更高的优先级

4:要注意:就算是过期了,并不标志内容一定不对了,只是提醒要求重验证

5:在Java中的设置示例:response.setHeader("Cache-Control","max-age=100“)

二:执行重验证

1:重验证的目的:是与服务器交互,判断缓存中的文档是否已经改变。如已经改变,就重新下载一份最新的文档,来代替缓存内容;如没有做修改,则只需获取新的HTTP头部(可能包含新的过期时间),并更新缓存中的头部。

2:在request的Http头设置:If-Modified-Since

如果服务端返回的报头中有“Last-Modified”,那么客户端在下一次请求报头中会包含“If-Modified-Since”,这两个头部是相互对应的。

当服务器收到客户端请求的“If-Modified-Since”之后,服务器通过比较这两个时间,若“Last-Modified”更大,表明客户端缓存中的内容已经过时,服务器会将最新的文档(新的Header)返回给客户端,状态码为200;否则认为客户端缓存中的内容仍然是最新的,只需向客户端返回304状态码,同时包含最新的HTTP头部。

3:在request的Http头设置:If-None-Match

这是一种比较文档标签(Entity tags,Etags)的方式。基本思想是为每一个文档生成一个Etag,它可以是某个序列号、版本号或者检验码。同样“If-None-Match”头部是与服务器端的“Etag”头部相对应的,这样服务器端只需要比较标签号就可以判断出客户端缓存中的文档是否是最新的。

浏览器缓存控制

HTTP规范中定义了服务器如何约束、限制客户端缓存的头部,按照优先级分别有:

1:Cache-Control:no-store:禁止缓存,浏览器会删除缓存的内容

2:Cache-Control:no-cache:禁止缓存,浏览器可能会缓存,只是限制本地缓存不能在没有与服务器执行一致性检查的前提下直接响应用户

3:Cache-Control:must-revalidate:要求缓存在响应用户请求之前一定要先保证缓存中的文档副本是最新的

4:Cache-Contro1:max-age:设置过期时间,若max-age=0,则表示不能缓存文档或者每次访问缓存前必须执行一致性检查

5:Expires

6:在Java中设置示例:

response.setHeader("Cache-Control", "no-cache");

response.addHeader("Cache-Control", "no-store");

response.setHeader("Pragma", "no-cache");

response.setDateHeader("Expires", -1);

response.setDateHeader("max-age", 0);

要注意:不同浏览器对这些功能的实现可能不同

F5和Ctr1+F5刷新的实现也不同:F5通常是驱使浏览器去执行一次一致性检查;而“Ctrl+F5”则是在删除本地缓存的前提下,去执行一致性检查

如何主动通知浏览器缓存失效

这个问题其实也是静态资源版本更新的问题,基本的解决思路:

1:页面引入js、css等统一做成单独的jsp

2:页面上使用ESI来引入这些jsp

3:如果后端修改了这些静态资源的内容,那么在这些单独的jsp上,修改链接,给这些链接加上“?版本号”或者“?时间戳”等,反正要修改一下这些链接

4:然后主动请求PURGE,以让Varnish里面缓存这些jsp的内容失效,这样Varnish会从后端重新获取这些jsp的内容,拼接好新的内容后返回给客户端

5:客户端浏览器会发起新的请求,去重验证资源是否有更新,发出的请求是按照这些新的链接发出的,那么服务器端是没有这些链接对应的Etag的,就会重新下载新的资源了

6:当然,由于更新资源和缓存内容之间会有一个时间差,对于大型的高并发的应用,这种不同步可能会造成一点小问题,这就需要更专业的工具来同步更新服务器的静态资源了。

反向代理服务器缓存

Varnish缓存

1:Varnish本身就是设计来做高速缓存的

2:一般按照请求的url进行缓存,可以订制自己的Hash策略

3:缓存的时候,按照内容的类型不同,设置好不同的ttl

4:如果在缓存期内,后端内容发生了改变,后端可以主动发出PURGE请求,让Varnish清除对应的缓存

5:对于动态页面的缓存,如果里面有需要根据请求的用户进行变化的内容,可以采用ESI技术,也可以采用Ajax的方式来获取动态内容

6:对于热点内容、高并发的内容,可以采用Varnish缓存+后端对动态内容静态化的组合方案来解决

Web应用对页面的缓存

Web应用对页面的缓存

1:前面使用了Varnish缓存的话,一般Web应用不需要对页面进行缓存

2:如果要做的话,常见思路是:

做一个Filter,检查请求的URL是否有对应的缓存(一般就放到内存中),或者是对应的生成好的静态Html,如果有,就获取内容直接返回;如果没有,就调用静态化的程序,生成一份要返回的Html的内容,设置到缓存中,然后返回。

3:当然,如果Web应用自己做页面内容缓存的话,那么缓存的过期,还有缓存的清除、更新等功能,就都得自己来做了

静态化

什么是静态化

就是把动态内容转化成为静态的、可以直接返回给客户端使用的过程

为何需要静态化

1:加快网站的运行速度,提升客户体验

2:减少对后端服务器的压力

3:为了SEO

静态化分类

一般分成真正静态化和伪静态化

实现真正静态化

基本的思路大都是:根据模板,从后端服务器和数据库动态获取数据,然后组合起来,形成静态页面的内容。

热点或高并发内容实现真正静态化的方案

1:Varnish配置一个缓存的时间,比如3分钟

2:后端程序利用这个时间,在这段时间,之中调用静态化功能生成静态页面

静态化的一些说明

1:要结合应用场景分析哪些页面,哪些内容适合静态化

2:跟客户信息相关的内容,不要包含在静态化内容里面

3:经常变化的内容,最好不要包含在静态内容里面

4:更新频率过高的内容,不适合静态化

5:后端实现静态化的时候,通常都需要配套做静态化的管理,比如设置哪些页面需要静态化;多长时间做一次静态化;静态化后的内容存放路径等等

6:从某种意义上说,Varnish的缓存做的就是静态化的功能

Web缓存和静态化的更多相关文章

  1. 「Java Web」主页静态化的实现

    一个站点的主页一般不会频繁变动,而大多数用户在訪问站点时不过浏览一下主页(未登陆).然后就离开了.对于这类訪问请求.假设每次都要通过查询数据库来显示主页的话,显然会给server带来多余的压力. 这时 ...

  2. 关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)

    本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部,不过该企业把这个事业部里的人事成本,系统运维成本特别 ...

  3. 关于大型网站技术演进的思考(十九)--网站静态化处理—web前端优化—上(11)

    网站静态化处理这个系列马上就要结束了,今天我要讲讲本系列最后一个重要的主题web前端优化.在开始谈论本主题之前,我想问大家一个问题,网站静态化处理技术到底是应该归属于web服务端的技术范畴还是应该归属 ...

  4. 页面静态化2 --- 使用PHP缓存机制来完成页面静态化(上)(ob_flush和flush函数区别用法)

    我们可以使用PHP自带的缓存机制来完成页面静态化,但在这里,需要说明一点,仅靠PHP缓存机制并不能完美的解决页面静态化,往往需要和其他页面静态技术(通常是伪静态技术)结合使用 例子: 当访问一个页面时 ...

  5. 网站静态化处理—web前端优化—下【终篇】(13)

    网站静态化处理—web前端优化—下[终篇](13) 本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部, ...

  6. 网站静态化处理—web前端优化—上

    网站静态化处理—web前端优化—上(11) 网站静态化处理这个系列马上就要结束了,今天我要讲讲本系列最后一个重要的主题web前端优化.在开始谈论本主题之前,我想问大家一个问题,网站静态化处理技术到底是 ...

  7. 网站静态化处理—web前端优化—上(11)

    网站静态化处理这个系列马上就要结束了,今天我要讲讲本系列最后一个重要的主题web前端优化.在开始谈论本主题之前,我想问大家一个问题,网站静态化处理技术到底是应该归属于web服务端的技术范畴还是应该归属 ...

  8. 【转】关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)

    本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部,不过该企业把这个事业部里的人事成本,系统运维成本特别 ...

  9. 【转】关于大型网站技术演进的思考(十九)--网站静态化处理—web前端优化—上(11)

    网站静态化处理这个系列马上就要结束了,今天我要讲讲本系列最后一个重要的主题web前端优化.在开始谈论本主题之前,我想问大家一个问题,网站静态化处理技术到底是应该归属于web服务端的技术范畴还是应该归属 ...

随机推荐

  1. Oracle 正则

    https://www.cnblogs.com/qmfsun/p/4467904.html 匹配汉字可以用Oracle 内置函数 unistr('\4e00') -unistr('\9fa5') 来定 ...

  2. jQuery横向上下排列鱼骨图形式信息展示代码时光轴样式(转自CSDN,原文链接附于文中)

    原文链接:http://www.jqueryfuns.com/resource/2173 $.fn.fishBone = function(data) { var colors = ['#F89782 ...

  3. Mysql出现(10061)错误提示的暴力解决办法

    上个月我还在说别人的怎么老是会错呢,我的就没事,嘿 今天就轮到我了 我发誓 我绝对没碰它 是它先动的手 言归正传   下面给你们 介绍 终极大招  为什么是终极大招呢  因为网上那些前辈们的方法我都试 ...

  4. LVS+nginx负载均衡知识点1

    lvs+nginx负载均衡 1       学习目标 掌握什么是负载均衡及负载均衡的作用和意义. 了解lvs负载均衡的三种模式. 了解lvs-DR负载均衡部署方法. 掌握nginx实现负载均衡的方法. ...

  5. centos7编译安装nginx

    一.安装依赖包 yum install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre-devel 二 ...

  6. 使用Dockerfile自定义一个包含centos,tomcat的镜像

    1.首先建立一个专用的dockerfile目录,方便统一存放将要创建的Dockerfile文件及相关资源, 例如:mkdir mydockerself 2.定位到mydockerself路径下,下载l ...

  7. python--第二十三天总结(一对多和多对多)

    Django 的 ORM 有多种关系:一对一,多对一,多对多. 各自定义的方式为 :        一对一: OneToOneField        多对一: ForeignKey        多 ...

  8. uvm_scoreboard

    http://www.eetop.cn/blog/index.php?uid/13812/action/viewspace/itemid/6826765/php/1 uvm_in_order_comp ...

  9. 企业BGP网络规划案例(二)

    设计思路梳理 1.AS的划分 : 由于该办公网物理上被划分为总部和两个异地的办公分支,总部和分支互联采用MSTP线路,为了方便管理和更为灵活的进行路由控制,选择BGP作为总部和分支的路由协议.关于AS ...

  10. docker-compose使用

    1.创建app.py项目文件,执行以下代码 import time import redis from flask import Flask app = Flask(__name__) cache = ...