Active Learner -- Learning in my life!

Welcome To Forrest's Space! Welcome To Back!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在 ASP.NET 中使用绝对过期实现 Page Cache

Posted on 2006-06-26 18:44  Forrest.Gao  阅读(1093)  评论(0编辑  收藏  举报

在 ASP.NET 中使用绝对过期实现 Page Cache

收集整理:CCF@HSTAR


上下文

您要在 ASP.NET 中构建一个 Web 应用程序,并且希望对页面进行缓存以提高性能。您已经评估了 Page Cache (页面缓存)中提出的备用选择方案,并且已决定采用绝对过期的策略。

实现策略

页面缓存通过对从动态网页生成的内容进行缓存来提高请求响应的吞吐量。默认情况下,在 ASP.NET 中支持页面缓存,但除非定义有效的过期策略,否则,不会对来自任何给定响应的输出进行缓存。要定义过期策略,可以使用低级 OutputCache API 或高级 @OutputCache 指令。

启用页面缓存后,对页面的第一个 GET 请求将创建一个页面缓存条目。该页面缓存条目用于响应随后的 GET 或 HEAD 请求,直到缓存的响应过期。

页面缓存遵循页面的过期策略。如果对过期策略为 60 秒的页面进行缓存,经过 60 秒之后,该页面将从输出缓存中删除。如果缓存在该时间之后收到另一个请求,它将执行网页代码并刷新缓存。这种过期策略称为"绝对过期",它意味着在某个时间之前页面一直是有效的。

下面的示例说明了使用@OutputCache指令对响应进行缓存的方式:

 

<%@ OutputCache Duration="60" VaryByParam="none" %>

<html>
  <script language="C#" runat="server">
    void Page_Load(Object sender, EventArgs e)
    {
        TimeMsg.Text = DateTime.Now.ToString("G");
    }
  </script>

  <body>
    <h3>Using the Output Cache</h3>

    <p>Last generated on: <asp:label id="TimeMsg" runat="server"/>
  </body>
</html>
该示例显示了生成响应的时间。要了解输出缓存的作用,请调用该网页,并注意生成响应的时间。然后刷新网页,您会注意到时间没有更改,这说明第二个响应是从缓存提供的。
下面的代码行激活对响应的页面缓存:

<%@ OutputCache Duration="60" VaryByParam="none" %>

此指令只说明,页面应该缓存 60 秒,页面不会因任何 GET 或 POST 参数而改变。在第一个 60 秒内收到的请求是从缓存提供的。经过 60 秒之后,该页面从缓存中删除;下一个请求再次缓存该页面。

测试考虑事项

页面缓存使测试变得更加困难。例如,如果您更改了网页,然后在浏览器中查看该网页,您可能不会看到更新的网页,因为浏览器显示的是从缓存提供的页面,而不是最新生成的页面。在理想情况下,您可以关闭页面缓存,然后运行不需要缓存的测试。当这些测试成功运行后,您可以启用缓存,然后运行需要缓存的测试。

结果上下文

在 ASP.NET 中使用绝对过期模式来实现 Page Cache 具有以下优缺点:

优点

这是到目前为止 ASP.NET 中最简单的页面缓存方法。如果您要分析 Web 应用程序的使用模式来确定缓存哪些页面,那么,在许多情况下绝对过期可能已经足够了,而且无疑是一个很好的开端。另外,还要考虑到网页上动态内容的变动性。例如,天气网页的过期策略可以是 60 分钟,因为天气不会变得很快。不过,显示股票报价的网页可能根本不能缓存。为了确定正确的过期时间,必须知道哪些是最频繁查看的网页,并理解网页所包含的数据的变动性。


您可以为不同的网页设置不同的过期策略。通过这种做法,您可以只对频繁访问的网页进行缓存,而不会将缓存空间浪费在很少访问的网页上。您还可以刷新包含的数据比其他数据更经常变动的网页。
缺点

缓存的页面上的动态内容可能是无效的。这是因为页面过期基于时间而不是内容。在前面描述的示例中,时间在几秒钟之后才显示在网页上。因为该网页每 60 秒构建一次,秒字段在页面构建后的瞬间内是无效的。此示例中的无效数据部分是很小的。例如,如果您要显示对时间非常敏感的金融报价,并且需要很高的准确性,请考虑采用可确保您决不会显示无效数据的缓存策略。(请参阅"Page Data Caching"。)


此策略不支持将参数传递到网页。动态网页常常由参数来确定。例如,天气网页可能用邮政编码作为参数。除非您希望为数千个邮政编码(例如,美国有 42,000 个邮政编码)创建不同的网页和 URL,否则,您不能使用绝对过期对该网页进行缓存。Vary-By-Parameter Caching 解决了这个问题。


只有整个网页保持不变时才适用绝对过期。在许多应用程序中,网页的大部分很少发生更改(非常适用缓存),但与经常更改的其他部分(不能进行缓存)是耦合在一起的。因为绝对过期模式只缓存整个网页,它不能利用像这样的局部更改。在这些情况下,Page Fragment Caching 可能是一个更好的选择,因为它可以对网页的一部分进行缓存。HTML 框架为模拟页面分段提供了另一个选择。不过,框架在 Web 浏览器中有一些已知问题,例如,导航和打印问题。


无法刷新缓存的页面。网页在过期或重新启动服务器之前,一直保留在缓存中。这就使测试成了问题。另外,在数据很少发生更改、可一旦发生更改决不能延迟的情况下,缓存也有很大的问题。例如,每两小时更新天气预报在大多数时间可能已经足够了。不过,如果飓风正在逼近,您也许不希望等两小时后再更新天气预报。


必须修改每页的代码才能更改过期策略。因为过期策略只能在代码中更改,所以没有关闭整个应用程序的缓存的机制。


在缓存中存储网页需要服务器上的磁盘空间。在前面描述的示例中,较小的网页不会需要很多磁盘空间。不过,随着每个网页上的内容以及缓存中网页数目的增加,要求 Web 服务器提供更多的磁盘空间。