`
evan1234
  • 浏览: 30122 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Servlet/JSP如何控制页面缓存于squid中

阅读更多

     近段时间在研究如何将Servlet/JSP中的伪动态页面缓存到Squid中来加速Web访问,在google上搜索"JSP在squid中的缓存"的信息,出来的信息比较少,后来差PHP,ASP的缓存相关资料及"深入体验JAVA Web开发内幕——核心基础.pdf"和"Squid中文权威指南"中的相关章节,总算实现了这个目的(有需要这两本书的兄弟可以mail我 )。基于自己的一些理解和试验成果,记下来供以后参考。

 

      HTML的HTTP协议头信息中控制着页面在几个地方的缓存信息,包括浏览器端,中间缓存服务器端(如:squid等),Web服务器端。本文讨论头信息中带缓存控制信息的HTML页面(JSP/Servlet生成好出来的也是HTML页面)在中间缓存服务器中的缓存情况。

 

 

      HTTP协议中关于缓存的信息头关键字包括Cache-Control(HTTP1.1),Pragma(HTTP1.0),last-Modified,Expires等。

 

      HTTP1.0中通过Pragma 控制页面缓存,可以设置:Pragma或no-cache。网上有非常多的文章说明如何控制不让浏览器或中间缓存服务器缓存页面,通常设置的值为no-cache,不过这个值不这么保险,通常还加上Expires置为0来达到目的。但是如我们刻意需要浏览器或缓存服务器缓存住我们的页面这个值则要设置为Pragma。

 

      HTTP1.1中启用Cache-Control 来控制页面的缓存与否,这里介绍几个常用的参数:

  • no-cache,浏览器和缓存服务器都不应该缓存页面信息;
  • public,浏览器和缓存服务器都可以缓存页面信息;
  • no-store,请求和响应的信息都不应该被存储在对方的磁盘系统中;
  • must-revalidate,对于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时;
  • max-age=xxx,s-max-age=xxx,替代Expires,表示应该在xxx秒后认为页面过时,后者指示代理服务器中缓存(通常称为共享缓存)的页面过期时间。(不过我试了好多次,这个选项一直没法实现,希望有人能补充!)

       通常我们不需要缓存页面时设置该值为"no-cache,no-store,must-revalidate"(分三行代码设置);需要缓存页面信息时则设置该值为"public,max-age,s-max-age"。

 

       Last-Modified只页面的最后生成时间,GMT格式;

       Expires过时期限值,GMT格式,指浏览器或缓存服务器在该时间点后必须从真正的服务器中获取新的页面信息;

       上面两个值在JSP中设置值为字符型的GMT格式,无法生效,设置long类型才生效;

 

       最后来看一下JSP或Servlet中如何设置缓存控制信息的代码:

   //本页面允许在浏览器端或缓存服务器中缓存,时限为10秒。
   java.util.Date date = new java.util.Date();
   response.setDateHeader("Last-Modified",date.getTime());
   response.setDateHeader("Expires",date.getTime()+10000);

   response.setHeader("Cache-Control", "public");
   response.setHeader("Pragma", "Pragma");
 
   //不允许浏览器端或缓存服务器缓存当前页面信息。
   response.setHeader( "Pragma", "no-cache" );
   response.setDateHeader("Expires", 0);

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

       如果HTML页面信息中包括了Expires头信息,则其相关的缓存机制不再处理该页面,而是安装页面的缓存控制要求来处理。所以做了上述工作后,Squid无需做任何配置上的修改(指Squid的refresh_pattern指令不处理这些页面 )。

 

 

       下面说一下Squid缓存一些静态资源的一些原理,Squid通过refresh_pattern指令来控制用户请求是否命中。

       "Squid中文权威指南"文章中描述Squid的refresh_pattern指令一段文章读起来非常的拗口,就是LM_factor比率的算法,这个算法的概念翻译的比较模糊,网络上传来传去的,感觉都是搞不清楚,后来参考"OReilly - Squid The Definitive Guide.chm"英文原文,总算明白过来

Responses that fall between the minimum and maximum are subject to Squid's 
last-modified factor  (LM-factor) algorithm. For such responses, Squid calculates
the response age and the LM-factor and compares it to the percent value. The 
response age is simply the amount of time passed since the origin server 
generated, or last validated, the response. The resource age is the difference 
between the Last-Modified and Date headers. The LM-factor is the ratio of the
response age to the resource age.

LM-factor的定义是(response age)/(the resource age).
其中response age是指HTTP头信息中的age信息。
resource age是指HTTP头信息中的Date值减去Last-Modified的值转化为秒的值。

各位可以通过curl命令(Linux下自带命令)来参看一个资源返回回来的HTTP头详细信息,如下面这样:
curl -I http://10.0.85.125:8384/mailproxy/welcome.htm
 

     经过试验,这个算法是正确的,同时这里要提醒一下,特别是对一些HTML类型的资源,max值不要设置的太大,如果设置的太大的话,有可能修改的文档信息需要非常长的时间才能得到更新,因为LM-factor参数值是变化的,越来越大,分母变大的结果就是比率越来越小,总是小于我们设定的比率,导致需要max来控制页面刷新。

分享到:
评论
3 楼 bushuang 2009-06-26  
同2楼问,squid应用场景是怎么样的?例如博客能不能适用
2 楼 robinqu 2009-06-10  
如果页面上针对某个用户的特定内容,应该怎么搞缓存?
1 楼 jinkam 2009-01-03  
Good,请继续努力 

相关推荐

    缓存代理服务器Squid-教程

    Squid是一个高性能的代理缓冲服务器,也许你已经用过Windows平台下的WinGate,MS Proxy Server等功能类似的产品。Squid是一个应用级代理,在保证客户端主机和服务器主机网络连通后,需要客户端软件做相应的设置后...

    squid缓存服务器的研究

    suqid 缓存服务器整理的相关内容,可以参考的。适合于centos7系统的

    Squid web缓存技术

    web缓存技术,cache Squid 配置 安装

    squid缓存详细配置

    文档为squid缓存服务的配置文档,系统为CentOS部署,本人自己部署成功后整理的文档,绝对清晰。

    web 缓存技术 squid

    web 缓存技术squid ,chm格式,英文文档

    刷新squid缓存脚本

    清理squid缓存,直接执行sh 脚本名,不过还需要知道要清理的squid服务器列表和需要清理的url列表

    Squid for Windows 配置 有缓存

    squid for windows 2.7 以上版本

    squid缓存服务器的配置

    squid缓存服务器的配置,一般运营商所使用的代理服务器

    squid 配置缓存服务器

    NULL 博文链接:https://baobeituping.iteye.com/blog/1331539

    Squid中文权威指南

    当下一次有人需要同一页面时,Squid可以简单地从磁盘中读到它,那样数据迅即就会传输到客户机上。当前的Squid可以处理HTTP,FTP,GOPHER,SSL和WAIS等协议。但它不能处理如POP,NNTP,RealAudio以及其它类型的东西。

    squid配置文档

    1、 安装squid #rpm –ivh squid-*.rpm 2、 备份squid配置文件squid.conf #cp /etc/squid/squid.conf /home 3、 删除默认squid配置文件 #cd /etc/squid #rm –f squid.conf

    squid 强制缓存动态页面.docx

    squid 强制缓存动态页面.docx

    CentOS 32位搭建squid http代理,解决TCP_MISS/503

    NULL 博文链接:https://k19421.iteye.com/blog/2308526

    Squid中文权威指南.rar

    本人在工作中维护着数台Squid服务器,多次参阅Duane Wessels(他也是Squid的创始人)的这本书,原书名是"Squid: The Definitive Guide",由O'Reilly出版。我在业余时间把它翻译成中文,希望对中文Squid用户有所帮助...

    网络代理缓存Squid存储系统分析.pdf

    网络代理缓存Squid存储系统分析.pdf 网络代理缓存Squid存储系统分析.pdf

    squid中文权威指南

    squid中文权威指南,不错的缓存资源,值得看看,中文版本

    Squid使用手册.rar

    5.9 重配置运行中的squid 进程 5.10 滚动日志文件 第6 章访问控制 6.1 访问控制元素 6.2 访问控制规则 6.3 常见用法 6.4 测试访问控制 第7 章磁盘缓存基础 7.1 cache_dir指令 7.2 磁盘空间基准 7.3 对象...

Global site tag (gtag.js) - Google Analytics