ASP.NET 缓存
在这篇文章中,我想分享我在 ASP.NET 缓存方面的经验和知识,以及它如何提高您的网站性能。
引言
在这篇文章中,我想分享我在 ASP.NET 缓存方面的经验和知识,以及它如何提高您的网站性能。正如大家所知,性能是您开发的任何应用程序或代码的关键要求。对于任务关键型网站,缓存是显著提高网络响应时间的最佳方式。缓存是将常用数据存储在服务器上以满足后续请求的过程。您会发现从内存中获取数据或对象比从头开始重新创建网页或其中包含的项目要快得多。
何时以及为何使用缓存
正确使用和微调缓存方法将提高网站的性能和可伸缩性。然而,不当使用缓存实际上会降低速度并消耗大量的服务器时间和内存使用量。
当您的网页中的数据或静态内容不经常更改时,很适合使用缓存。
例如,显示延迟 20 分钟数据的股票市场网站实际上可以使用数据缓存来存储数据,这样可以减少用户每次刷新页面时对数据库的调用。
另一个很好的例子是使用部分页面缓存来存储一些不经常更改的或静态内容。如果您的网站显示大量信息或功能,您实际上可以将静态或不经常更改的内容分组到用户控件中,然后为这些用户控件设置缓存。您可以设置缓存过期的时间,以便它会从数据库加载新数据。
缓存类型
- 输出缓存(页面缓存):您可以实现的最简单、最直接的缓存。适用于缓存经常访问的静态页面。您可以将下面的代码复制并粘贴到您的 ASP.NET 页面中
VaryByParam
-VaryByParam
属性用于根据 HTTP Post 或 HTTP Get 协议缓存不同类型的页面。例如:您可以根据提供的不同查询字符串缓存动态内容。VaryByControl
-VaryByControl
可用于缓存页面内的用户控件。例如,您可以缓存一个包含ComboBox
的用户控件,该控件渲染世界上所有的国家名称。并且,国家数据可以从数据库中检索;这将显著提高页面加载时间。VaryByCustom
- 为了使缓存更加灵活,Microsoft 内置了根据字符串缓存页面的功能,然后由应用程序的实际代码控制。VaryByHeader
:根据指定标头的变化来变化缓存条目。- 部分页面(用户控件)缓存 - 类似于输出缓存,部分页面缓存允许您缓存网站的某些块。例如,您只能缓存页面的中心部分。部分页面缓存是通过用户控件的缓存来实现的。您可以构建包含许多用户控件的 ASP.NET 页面,然后对您选择的用户控件应用输出缓存。这将只缓存您想要的页面部分,而将页面的其他部分置于缓存范围之外。这是一个非常好的功能,如果操作得当,可以使页面性能更好。
- 数据缓存 - 如果您想缓存页面的输出,输出缓存和部分页面缓存很有用。但是,如果您想缓存
DataSet
对象或任何集合对象,您可以使用数据缓存来实现。
<%@ OutputCache Duration="60" VaryByParam="None" %>
Duration
属性指定页面将在内存中保留多长时间(以秒为单位)。当缓存过期时,ASP.NET 引擎将自动重新加载并刷新页面。如果页面从不更改,您可以将持续时间设置为非常长的时间。
输出缓存的有效参数
<%@ OutputCache Duration="60" VaryByParam="CategoryID" %>
在这种情况下,ASP.NET 引擎将根据提供的不同查询字符串缓存动态页面。如果您的页面根据查询字符串生成不同的内容,那么您需要将其放在输出缓存指令中,否则所有用户都将看到相同的内容。
如果您想根据查询字符串参数的任何差异缓存页面的新版本,请使用 VaryByParam = "*"
,如下面的代码所示
<%@ OutputCache Duration="60" VaryByParam="*" %>
它确实有一个“开箱即用”的属性,Browser。当 VaryByCustom
设置为 Browser
时,每次不同的浏览器代理和主版本号请求页面时,页面都会被缓存。
<%@ OutputCache Duration="60" VaryByCustom="browser" %>
如果您想拥有自己的一套缓存规则,那么您可能需要修改 global.aspx 中的一些代码。例如,您可能需要根据名为 Language
的 cookie 为不同的用户组区分缓存内容。然后,您需要将以下代码复制并粘贴到您的 global.asax 文件中
VB.NET 代码
Overrides Function GetVaryByCustomString(ByVal context as HttpContext,_ ByVal arg as String) As String If arg.ToLower() = "cookies" Then Dim cookie as HttpCookie = context.Request.Cookies("Language") If cookie isNot nothing Then Return cookie.Value End if End If Return MyBase.GetVaryByCustomString(context,arg) End Function
C# 代码
public override string GetVaryByCustomString(HttpContext context, string arg) { if (arg.ToLower() == "cookies") { HttpCookie cookie = context.Request.Cookies["Language"]; if (cookie != null) { return cookie.Value; } } return base.GetVaryByCustomString(context, arg); }
之后,在您的 OutputCache
指令中将 VaryByCustom
属性设置为“cookies
”。通过这样做,您将根据客户端语言 cookie 生成一组不同的缓存。这只是进行 VaryByCustom
缓存的一个示例;您实际上可以通过区分基于用户登录的缓存等来创建自己的缓存规则。
注意:通常,用户控件放置在多个页面上以最大化重用。然而,当这些用户控件(ASCX 文件)使用 @OutputCache
指令缓存时,它们是按页面缓存的。这意味着即使用户控件在 pageA.aspx 上输出与在 pageB.aspx 上相同的 HTML,其输出也会被缓存两次。您可以通过在输出缓存指令中添加 Shared = true
来防止这种情况发生。
<%@ OutputCache Duration="300" VaryByParam="*" Shared="true" %>
通过设置 Shared
属性,内存节省可以非常大。如果您有一个使用 OutputCache
指令的 ASCX 用户控件,请记住用户控件只存在于第一次请求。
ASP.NET 有一个名为 Cache
的类,用于缓存特定数据项,以便稍后在特定页面或页面组中使用。Cache
使您能够存储从简单的名称/值对到更复杂的对象,如数据集和整个 aspx 页面。
VB.NET
Cache("MyDataSet") = myDataSet;
C#
Cache("MyDataSet") = myDataSet;
要从缓存中检索数据,您可以使用下面的代码
VB.NET
Dim ds as New DataSet
ds = CType(Cache("MyDataSet"),DataSet)
C#
DataSet ds = new DataSet();
ds = (DataSet) Cache["MyDataSet"];
结论
正如我们刚刚看到的,使用 ASP.NET 缓存网页非常容易,只需简单的一行代码即可完成。通过了解 ASP.NET 的缓存功能,您可以提高 Web 应用程序的性能。但请记住,ASP.NET 中的缓存是 CPU 和内存之间的权衡。就像,制作这个页面有多难,以及您是否能够负担得起保存 200 个版本。如果它只有 5KB 的 HTML,潜在的兆字节内存可以带来巨大的回报,而不是成千上万次的数据库访问——从缓存中提供每个页面请求都可以节省一次数据库访问。