• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > 充分利用ASP.NET的三种缓存提高站点性能的注意方法

充分利用ASP.NET的三种缓存提高站点性能的注意方法

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了asp 缓存,asp禁止缓存,asp 清除缓存,asp不缓存,asp站点等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
ASP.NET提供三种主要形式的缓存:页面级输出缓存、用户控件级输出缓存(或称为片段缓存)和缓存API。

尽早缓存;经常缓存 
  您应该在应用程序的每一层都实现缓存。向数据层、业务逻辑层、UI或输出层添加缓存支持。内存现在非常便宜-因此,通过以智能的方式在整个应用程序中实现缓存,可以获得很大的性能提高。

页面级输出缓存

最简单的缓存形式,只是在内存中保留为响应请求而发送的HTML的副本。
要实现页面输出缓存,只要将一条OutputCache指令添加到页面即可。

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

  它支持五个属性(或参数),其中两个是必需的。

  Duration 必需属性。页面应该被缓存的时间,以秒为单位。必须是正整数。 

  Location 缓存的位置。参数:Any、Client、Downstream、None、Server或ServerAndClient。

  VaryByParam 必需属性。Request中变量的名称。none表示没有变动。*用于为每个不同的变量创建缓存。
        变量之间用“;”进行分隔。

  VaryByHeader 基于指定的标头中的变动改变缓存条目。

  VaryByCustom 允许在global.asax中指定自定义变动(例如,“Browser”)。

  利用必需的Duration和VaryByParam选项的组合可以处理大多数情况。例如,如果您的产品目录允许用户基于categoryID和页变量查看目录页,您可以用参数值为“categoryID;page”的VaryByParam将产品目录缓存一段时间(如果产品不是随时都在改变,一小时还是可以接受的,因此,持续时间是3600秒)。这将为每个种类的每个目录页创建单独的缓存条目。每个条目从其第一个请求算起将维持一个小时。

  示例:VaryByCustom用于支持浏览器自定义

  为了使每个浏览器都具有单独的缓存条目,VaryByCustom的值可以设置为“browser”。此功能已经内置在缓存模块中,并且将针对每个浏览器名称和主要版本插入单独的页面缓存版本。

<%@ OutputCache Duration="60" VaryByParam="None" VaryByCustom="browser"%> 



片段缓存,用户控件输出缓存

  片段缓存使用的语法与页面级输出缓存一样,但其应用于用户控件(.ascx文件)而不是Web窗体。

       用户控件还支持名为VaryByControl的属性,该属性将根据.ascx文件中的服务器控件的值改变该控件的缓存。如果指定了VaryByControl,可以省略VaryByParam。如果所有页面都使用相同的用户控件,则可以设置参数Shared的值为“true”。

<%@ OutputCache Duration="60" VaryByParam="*" %> 
缓存用户控件60秒,并针对Request的每个变动创建单独的缓存。

<%@ OutputCache Duration="60" VaryByParam="none" VaryByControl="myControlName" %> 
缓存用户控件60秒,并针对"myControlName"这个DownList控件的每个不同值创建单独的缓存。

<%@ OutputCache Duration="60" VaryByParam="none" VaryByCustom="browser" Shared="true" %> 
缓存用户控件60秒,并针对每个浏览器名称和主要版本创建一个缓存条目。每个引用此用户控件的所有页面共享(只要所有页面都用相同的ID引用该控件即可)。



缓存API,使用Cache对象

  页面级和用户控件级输出缓存的确是一种可以迅速而简便地提高站点性能的方法,但是在ASP.NET中,缓存的真正灵活性和强大功能是通过Cache对象提供的。使用Cache对象,您可以存储任何可序列化的数据对象,基于一个或多个依赖项的组合来控制缓存条目到期的方式。这些依赖项可以包括自从某对象被缓存后经过的时间、自从某对象上次被访问后经过的时间、对文件或文件夹的更改以及对其他缓存对象的更改,在略作处理后还可以包括对数据库中特定表的更改。

  在Cache中存储数据

  在Cache中存储数据的最简单的方法就是使用一个键为其赋值,就像HashTable或Dictionary对象一样:

Cache["key"] = "value"; 

  这种做法将在缓存中存储项,同时不带任何依赖项,因此它不会到期,除非缓存引擎为了给其他缓存数据提供空间而将其删除。要包括特定的缓存依赖项,可使用Add()或Insert()方法。其中每个方法都有几个重载。Add()和Insert()之间的唯一区别是,Add()返回对已缓存对象的引用,而Insert()没有返回值(在C#中为空,在VB中为Sub)。

  示例

Cache.Insert("key", myXMLFileData, new 
System.Web.Caching.CacheDependency(Server.MapPath("users.xml"))); 

  该示例可将文件中的xml数据插入缓存,无需在以后请求时从文件读取。CacheDependency的作用是确保缓存在文件更改后立即到期,以便可以从文件中提取最新数据,重新进行缓存。如果缓存的数据来自若干个文件,还可以指定一个文件名的数组。

Cache.Insert("dependentkey", myDependentData, new 
System.Web.Caching.CacheDependency(new string[] {}, new string[] 
{"key"})); 

  该示例可插入键值为“key”的第二个数据块(取决于是否存在第一个数据块)。如果缓存中不存在名为“key”的键,或者如果与该键相关联的对象已到期或被更新,则“dependentkey”的缓存条目将到期。

Cache.Insert("key", myTimeSensitiveData, null, 
DateTime.Now.AddMinutes(1), TimeSpan.Zero); 

  绝对到期:此示例将对受时间影响的数据缓存一分钟,一分钟过后,缓存将到期。注意,绝对到期和滚动到期(见下文)不能一起使用。

Cache.Insert("key", myFrequentlyAccessedData, null, 
System.Web.Caching.Cache.NoAbsoluteExpiration, 
TimeSpan.FromMinutes(1)); 

  动态滚动到期:此示例将缓存一些频繁使用的数据。数据将在缓存中一直保留下去,除非数据未被引用的时间达到了一分钟。注意,动态滚动到期和绝对到期不能一起使用。

  更多选项

  除了上面提到的依赖项,我们还可以指定项的优先级(依次为low、high、NotRemovable,它们是在System.Web.Caching.CacheItemPriority枚举中定义的)以及当缓存中的对象到期时调用的CacheItemRemovedCallback函数。大多数时候,默认的优先级已经足够了-缓存引擎可以正常完成任务并处理缓存的内存管理。CacheItemRemovedCallback选项考虑到一些很有趣的可能性,但实际上它很少使用。不过,为了说明该方法,我将提供它的一个使用示例:

  CacheItemRemovedCallback示例

System.Web.Caching.CacheItemRemovedCallback callback = new System.Web.Caching.CacheItemRemovedCallback (OnRemove);
Cache.Insert("key",myFile,null, 
 System.Web.Caching.Cache.NoAbsoluteExpiration, 
 TimeSpan.Zero, 
 System.Web.Caching.CacheItemPriority.Default, callback);
. . .
public static void OnRemove(string key, object cacheItem, 
 System.Web.Caching.CacheItemRemovedReason reason)
{
 AppendLog("The cached value with key '" + key + 
"' was removed from the cache. Reason: " + 
 reason.ToString()); 
} 

  该示例将使用AppendLog()方法中定义的任何逻辑来记录缓存中的数据到期的原因。通过在从缓存中删除项时记录这些项并记录删除的原因,您可以确定是否在有效地使用缓存或者您是否可能需要增加服务器上的内存。注意,callback是一个静态(在VB中为Shared)方法,建议使用该方法的原因是,如果不使用它,保存回调函数的类的实例将保留在内存中,以支持回调(对static/Shared方法则没有必要)。

  该特性有一个潜在的用处-在后台刷新缓存的数据,这样用户永远都不必等待数据被填充,但数据始终保持相对较新的状态。但实际上,此特性并不适用于当前版本的缓存API,因为在从缓存中删除缓存的项之前,不触发或不完成回调。因此,用户将频繁地发出尝试访问缓存值的请求,然后发现缓存值为空,不得不等待缓存值的重新填充。我希望在未来的ASP.NET版本中看到一个附加的回调,可以称为CachedItemExpiredBut

  NotRemovedCallback,如果定义了该回调,则必须在删除缓存项之前完成执行。

  缓存数据引用模式

  每当我们尝试访问缓存中的数据时,都应该考虑到一种情况,那就是数据可能已经不在缓存中了。因此,下面的模式应该普遍适用于您对缓存的数据的访问。在这种情况下,我们假定已缓存的数据是一个数据表。

public DataTable GetCustomers(bool BypassCache)
{
 string cacheKey = "CustomersDataTable";
 object cacheItem = Cache[cacheKey] as DataTable;
 if((BypassCache) || (cacheItem == null))
 {
  cacheItem = GetCustomersFromDataSource();
  Cache.Insert(cacheKey, cacheItem, null,
  DateTime.Now.AddSeco
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 对asp.net缓存 的深入了解
  • 充分利用ASP.NET的三种缓存提高站点性能的注意方法

相关文章

  • 2018-08-20Jexus部署.Net Core项目
  • 2017-05-11asp.net SqlParameter如何根据条件有选择的添加参数
  • 2017-05-11.dll 文件反编译的工具软件集合
  • 2017-05-11最锋利的Visual Studio Web开发工具扩展:Web Essentials使用详解
  • 2017-05-11基于自定义Unity生存期模型PerCallContextLifeTimeManager的问题
  • 2017-05-11.NET c# 单体模式(Singleton)
  • 2017-05-11C#反射实例学习及注意内容
  • 2017-05-11使用Fiddler调试visual studion多个虚拟站点的问题分析
  • 2017-05-11ASP.NET防止页面刷新的两种解决方法小结
  • 2017-05-11Log4net日志记录组件的使用步骤详解和下载

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • VS2010制作第一个简单网站
    • .Net中的集合排序可以这么玩你知道吗
    • 未将对象引用设置到对象的实例 (System.NullReferenceException)
    • RadioButtonList绑定图片及泛型Dictionary应用
    • Asp.net Core MVC中怎么把二级域名绑定到特定的控制器上
    • asp.net 下拉列表无级数据绑定实现代码
    • 如何处理ASP.NET Core中HTML5客户端路由回退的问题
    • .NET开发实现一个微信跳一跳的辅助程序
    • asp.net动态产生checkbox(数据源为DB或内存集合)
    • 如何在ASP.NET Core应用程序运行Vue并且部署在IIS上详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有