dev2dev.bea.com.cn
首页 资源中心 dev2dev学堂 在线技术论坛 专家Blog User Group CodeShare

有关缓存的更多信息

2008-03-13 10:34:21 | 评论 (0) | 被访问(209)次



 我的上一篇文章对porlet缓存作了简要解释之后,许多人都觉得意犹未尽。因此应大家要求,我将在本文中对porlet的缓存机制做进一步的解析。本文将介绍有关portlet、缓存键的更多知识,并且将结合实际的portlet例子演示ALUI的缓存行为。

  这篇文章在很大程度上重新解释了 缓存电子文档 中的内容(希望更加全面)。言归正传,让我们看看介绍了哪些内容吧。

设置一个演示Portlet

  首先,我想向大家展示我所编写的一段JSP代码,可以用于测试这种行为。有时,在对一些问题产生困扰的时候,编写测试代码会有助于理解。这段代码将比较Javascript时间戳(每次都呈现在客户机上)和服务器端的时间戳(如果缓存了HTML文件,则这个时间戳不会发生变化)。这段JSP代码还可以允许我们使用一些类似response.setHeader的内容修改HTTP报头。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
          // get current time for manipulation
          Date theTime = new Date();
%>
 
<p>This portlet tests the caching framework.
<script>var dt = new Date();</script>
<br><br>Javascript time: <script>document.write(dt.toString());</script>
<br><br>Server side time: <%=theTime.toString()%>
</p>

缓存,步骤1:HTTP报头

  portlet缓存行为在门户中的第一道防线是portlet响应中发送的HTTP报头。有一些报头是应该值得我们注意的,它们将覆盖门户中所配置的任何其他缓存设置,除了最小缓存时间之外。如果没有发送任何报头,那么缓存将使用默认的Web服务设置(下文将列出其设置)并使用公开缓存(所有用户在缓存中都有一个portlet副本)。

  此处列出了三个重要的报头(我在 电子文档 中忽略了这一点):

  • 终止(Expires)——这是在portlet中缓存HTML的最简单方法。将这个报头设置为HTTP格式的日期(比如说Sun,15 Jul 2007 16:00:00 GMT),然后门户将会在指定的时间检查新内容(并缓存这些内容,直到终止时间)。
  • 最后修改(Last-Modified)——这个报头指定了内容最后修改的日期。与设置Expires有所不同,我们可以在每次发送请求时都检查一次缓存;不过门户只检查HTTP报头,而不是整个请求内容。当且仅当这个报头发生修改时才会刷新缓存。
  • 缓存控制(Cache-Control)——这或许是所有报头中最重要的一个,因为它可以控制每个用户的缓存开关(设置为private可以根据每个用户缓存portlet,请参阅步骤3获得详细信息),并且允许我们关闭所有的缓存(设置为no-cache)。

  如果您仍然觉得困惑,这篇链接文章 对HTTP缓存进行了详实的介绍。

缓存,步骤2:Web服务设置

  portlet缓存框架的第二道防线是针对portlet配置的Web服务设置(目前还不必担心一些高级设置)。这些设置只是通知门户何时开始发起刷新缓存的请求,以及何时必须要发起刷新缓存的请求。下图显示了其Web服务设置的窗口:

  但是我们应该记住,门户会努力符合HTTP标准,因此步骤1中所讨论的HTTP报头在最长和最短缓存时间之间仍然是有效的。事实上,如果使用Expires报头指示缓存仍然有效,那么内容存储在缓存中的时间可以比最长时间长

缓存,步骤3:缓存键

  portlet缓存框架的第三道防线是portlet缓存键(cache key)。这个键可指示门户缓存中的数据是否已损坏。如果缓存键发生了变化,则必须请求新内容。从程序方面思考,缓存键就是一个追加在一组数据后面的字符串。每次页面加载portlet时,portlet将构建这个字符串并且与之关联。如果下一次请求页面时这个字符串发生了变化,那么缓存变为为无效并且必须请求一个新的HTML副本。

  可通过两类设置构建缓存键:一种设置始终是缓存键的一部分,另一种只有在portlet中使用时才是缓存键的一部分。我们如何指示出是否在使用它们呢?相当简单。当我们选择通过Web服务设置将它们发送给portlet时,门户会自动假定我们需要在缓存键中使用它们。可以使用Web服务编辑器中的高级设置(Advanced Settings)调整设置参数:

  在默认情况下,如果以下任意一项内容发生了变化,则缓存键将变为无效,并且通常需要请求新内容:

  • 传递给portlet的任何类型的设置:portlet设置、用户设置、社区设置、管理设置、会话首选项和用户信息
  • 地区
  • portlet的实际URL
  • 社区
  • 内容模式(实际上,我也不清楚内容模式是什么,但是使用文档中有这一项)

  此外,我们在检查上面各项内容的时候,以下这些项目将对缓存键产生影响:

  • 时区
  • 页面ID
  • 社区安全性(访问控制列表)
  • 体验定义(Experience Definition)
  • Portlet排列(Portlet Alignment)
  • 发送给portlet的活动权力(Activity Right)

其他问题

  以下列出了缓存中的一些比较容易混淆的概念,这些问题曾经困扰了我很久:

  • 304重定向状态代码——如果使用response.setRedirect或Response.Redirect会怎样呢?会无法使用门户中的缓存吗?不会,只要在门户中重定向的页面没有发生变化(我们的缓存键是基于URI的),将缓存任何重定向的页面,而不是重定向该页面。
  • Javascript和图像——这些内容并不会为portlet缓存,它们是通过网关缓存的。这主要表示它们只为Web服务器缓存内容,并且只遵循浏览器通常所遵循的规则(如果您为apache中的静态内容设置了一个expires报头,那么网关将会遵循该规则——如果没有设置则会重新请求该内容)。
  • AJAX——同样,任何动态的Javascript请求也会损失基于portlet的缓存机制。其原因相当明显:门户无法为每个portlet跟踪外来的请求。同样,这些请求将通过网关,并且您的浏览器将负责处理任何HTTP报头。
  • 默认行为——如果未指定任何报头,那么缓存将依照Web服务设置并使用公开缓存(而不是为每个用户使用单独的缓存)。

  与以往一样,我无法保证本文中的所有内容都是准确无误的。您可以自己尝试使用portlet缓存设置,但是一定要记住必须合理地使用它们。

原文出处:http://dev2dev.bea.com/blog/rbrodbec/archive/2007/07/more_than_5_sec.html



Tags: Caching portlet 缓存
文章评论:(以下网友留言只代表个人观点,不代表BEA观点和立场)
暂时没有评论!

2008年03月

          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
RSS订阅

Ross Brodbeck's Blog搜索