在 ASP.NET 网页 (Razor) 站点中缓存数据以提高性能

作者 Tom FitzMacken

本文介绍如何使用帮助程序缓存信息,以提高 ASP.NET 网页 (Razor) 网站的性能。 你可以通过让网站存储(即缓存)数据的结果来加速网站,这些数据通常需要花费相当长的时间进行检索或处理,并且不会经常更改。

你将了解的内容:

  • 如何使用缓存来提高网站的响应能力。

以下是本文中介绍的 ASP.NET 功能:

  • 帮助 WebCache 程序。

本教程中使用的软件版本

  • ASP.NET 网页 (Razor) 3

本教程也适用于 ASP.NET 网页 2。

每当有人从您的网站请求页面时,Web 服务器必须执行一些工作才能满足该请求。 对于某些页面,服务器可能必须执行 (相对) 较长时间的任务,例如从数据库检索数据。 即使这些任务在绝对情况下不会花费很长时间,如果站点遇到大量流量,导致 Web 服务器执行复杂或缓慢任务的一系列单独请求可能会增加大量工作。 这最终会影响站点的性能。

在这种情况下,提高网站性能的一种方法是缓存数据。 如果你的网站收到对相同信息的重复请求,并且不需要为每个人修改该信息,并且信息不具有时间敏感性,则可以提取一次数据,然后存储结果,而不是重新提取或重新计算。 下次请求传入该信息时,只需将其从缓存中获取。

通常,缓存不经常更改的信息。 将信息放入缓存时,信息将存储在 Web 服务器上的内存中。 可以指定缓存时间(从秒到天)。 缓存期限到期后,信息会自动从缓存中删除。

注意

缓存中的条目可能会因过期以外的原因而被删除。 例如,Web 服务器可能暂时运行内存不足,回收内存的一种方法是将条目从缓存中抛出。 如你所见,即使已将信息放入缓存中,也需要检查,以确保在需要时信息仍然存在。

假设网站有一个显示当前温度和天气预报的页面。 若要获取此类信息,可以向外部服务发送请求。 由于此信息在两小时内不会发生太大 (变化,例如,) 并且由于外部调用需要时间和带宽,因此非常适合缓存。

将缓存添加到页面

ASP.NET 包括一个 WebCache 帮助程序,它可以轻松地将缓存添加到站点,并将数据添加到缓存。 在此过程中,你将创建一个缓存当前时间的页面。 这不是一个实际示例,因为当前时间经常变化,而且计算并不复杂。 但是,这是说明如何操作缓存的好方法。

  1. 将名为 WebCache.cshtml 的新页面添加到网站。

  2. 将以下代码和标记添加到页面:

    @{
        var cacheItemKey = "CachedTime";
        var cacheHit = true;
        var time = WebCache.Get(cacheItemKey);
    
        if (time == null) {
            cacheHit = false;
        }
    
        if (cacheHit == false) {
            time = @DateTime.Now;
            WebCache.Set(cacheItemKey, time, 1, false);
        }
    }
    <!DOCTYPE html>
    <html>
    <head>
        <title>WebCache Helper Sample</title>
    </head>
    <body>
        <div>
            @if (cacheHit) {
                @:Found the time data in the cache.
            } else {
                @:Did not find the time data in the cache.
            }
        </div>
        <div>
            This page was cached at @time.
        </div>
    </body>
    </html>
    

    缓存数据时,使用在网站中唯一的名称将其放入缓存中。 在这种情况下,你将使用名为 的 CachedTime缓存项。 这是 cacheItemKey 代码示例中显示的 。

    代码首先读取 CachedTime 缓存条目。 如果 (返回值,即如果缓存条目) 不为 null,则代码仅将时间变量的值设置为缓存数据。

    但是,如果缓存项不存在 (即为 null) ,代码将设置时间值,将其添加到缓存,并将过期值设置为一分钟。 一分钟后,缓存条目将被丢弃。 (缓存中项的默认过期值为 20 分钟。) 命令 WebCache.Set(cacheItemKey, time, 1, false) 演示如何将当前时间值添加到缓存并将其过期时间设置为 1 分钟。 将 slidingExpiration 参数设置为 false 意味着每次请求时都不会续订过期时间。 它将在最初添加到缓存后的 1 分钟后过期。 如果将此值设置为 true 1 分钟过期时间,则每次从缓存请求该值时,都会重置该值。

    此代码说明了缓存数据时应始终使用的模式。 在从缓存中获取内容之前,始终首先检查方法是否WebCache.Get返回 null。 请记住,缓存项可能已过期,或者可能由于其他原因而被删除,因此永远无法保证任何给定条目都位于缓存中。

  3. 在浏览器中运行 WebCache.cshtml 。 (确保在运行之前在 “文件” 工作区中选择页面。) 首次请求页面时,时间数据不在缓存中,并且代码必须向缓存添加时间值。

    cache-1

  4. 在浏览器中刷新 WebCache.cshtml 。 这一次,数据在缓存中的时间。 请注意,自上次查看页面以来,时间没有更改。

    cache-2

  5. 等待一分钟以清空缓存,然后刷新页面。 该页再次指示在缓存中找不到时间数据,并将更新时间添加到缓存中。

其他资源