在 ASP.NET 网页 (Razor) 站点中缓存数据以提高性能
本文介绍如何使用帮助程序缓存信息,以提高 ASP.NET 网页 (Razor) 网站的性能。 你可以通过让网站存储(即缓存)数据的结果来加速网站,这些数据通常需要花费相当长的时间进行检索或处理,并且不会经常更改。
你将了解的内容:
- 如何使用缓存来提高网站的响应能力。
以下是本文中介绍的 ASP.NET 功能:
- 帮助
WebCache
程序。本教程中使用的软件版本
- ASP.NET 网页 (Razor) 3
本教程也适用于 ASP.NET 网页 2。
每当有人从您的网站请求页面时,Web 服务器必须执行一些工作才能满足该请求。 对于某些页面,服务器可能必须执行 (相对) 较长时间的任务,例如从数据库检索数据。 即使这些任务在绝对情况下不会花费很长时间,如果站点遇到大量流量,导致 Web 服务器执行复杂或缓慢任务的一系列单独请求可能会增加大量工作。 这最终会影响站点的性能。
在这种情况下,提高网站性能的一种方法是缓存数据。 如果你的网站收到对相同信息的重复请求,并且不需要为每个人修改该信息,并且信息不具有时间敏感性,则可以提取一次数据,然后存储结果,而不是重新提取或重新计算。 下次请求传入该信息时,只需将其从缓存中获取。
通常,缓存不经常更改的信息。 将信息放入缓存时,信息将存储在 Web 服务器上的内存中。 可以指定缓存时间(从秒到天)。 缓存期限到期后,信息会自动从缓存中删除。
注意
缓存中的条目可能会因过期以外的原因而被删除。 例如,Web 服务器可能暂时运行内存不足,回收内存的一种方法是将条目从缓存中抛出。 如你所见,即使已将信息放入缓存中,也需要检查,以确保在需要时信息仍然存在。
假设网站有一个显示当前温度和天气预报的页面。 若要获取此类信息,可以向外部服务发送请求。 由于此信息在两小时内不会发生太大 (变化,例如,) 并且由于外部调用需要时间和带宽,因此非常适合缓存。
将缓存添加到页面
ASP.NET 包括一个 WebCache
帮助程序,它可以轻松地将缓存添加到站点,并将数据添加到缓存。 在此过程中,你将创建一个缓存当前时间的页面。 这不是一个实际示例,因为当前时间经常变化,而且计算并不复杂。 但是,这是说明如何操作缓存的好方法。
将名为 WebCache.cshtml 的新页面添加到网站。
将以下代码和标记添加到页面:
@{ 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。 请记住,缓存项可能已过期,或者可能由于其他原因而被删除,因此永远无法保证任何给定条目都位于缓存中。在浏览器中运行 WebCache.cshtml 。 (确保在运行之前在 “文件” 工作区中选择页面。) 首次请求页面时,时间数据不在缓存中,并且代码必须向缓存添加时间值。
在浏览器中刷新 WebCache.cshtml 。 这一次,数据在缓存中的时间。 请注意,自上次查看页面以来,时间没有更改。
等待一分钟以清空缓存,然后刷新页面。 该页再次指示在缓存中找不到时间数据,并将更新时间添加到缓存中。
其他资源
- 在图表中显示数据
- WEBCache API 参考 (MSDN)