13.3 ASP.NET缓存功能

  通常Web应用程序会处理大量的交互,在这些大量的交互中必然会造成频繁的数据处理。当Web应用程序中数据处理过于频繁时,会造成Web应用程序假死的状态,不仅如此,大量的重复请求还可能造成Web应用程序性能低下,这里就需要使用缓存减轻服务器压力。

13.3.1 缓存概述
  为了防止不必要的数据处理,ASP.NET允许开发人员将页面或数据进行缓存处理,当用户再次访问页面时,如果存在缓存则直接从缓存中获取用户信息或页面信息然后直接显示在客户端浏览器。这种缓存方式能够减少频繁的数据处理,减轻服务器压力。
1.应用程序缓存
  应用程序缓存通过使用编程实现键/值对将任意数据存储在内存空间中。使用应用程序缓存与使用应用程序状态的方法类似。但是,与应用程序状态不相同,应用程序缓存中的数据是容易丢失的,应用程序缓存并不是在整个运行过程中都存在,应用程序缓存有一定的超时时间,当时间超过缓存设定的时间,缓存会自动注销。
2.页面输出缓存
  在用户访问一个页面时,通常需要进行数据操作,例如网站的首页或其他信息页面,常常需要检索数据库中的数据并显示到页面中。如果每个用户的每次访问都需要进行一次数据操作的话,则当大量用户访问并进行数据操时将会导致性能降低甚至造成死锁。
  为了避免这种情况的出现,可以使用页面输出缓存。页面输出缓存允许开发人员将整页进行数据缓存。页面输出缓存对于那些不经常更改的但需要处理大量数据和事件的页面特别适用。
3.缓存依赖
  可以将缓存中的某一项的生存期配置为依赖于其他应用程序配置节,如某个文件或者数据库。当缓存依赖项被更改时,ASP.NET将从缓存中移除对该项的数据缓存。例如网站静态页面,如果该页面数据需要进行缓存,可以保存为一个HTML文件,当页面被请求时,页面首先会判断是否有缓存依赖,如果存在,则执行相应的方法进行数据显示,当HTML文件被更改或被移除后,页面再次被请求,则会创建一个缓存依赖。

13.3.2 页面输出缓存
  当用户访问页面时,整个页面将会被服务器保存在内存中,这样就对页面进行了缓存。当用户再次访问该页,页面不会再次执行数据操作,页面首先会检查服务器中是否存在缓存,如果缓存存在,则直接从缓存中获取页面信息,如果页面不存在,则创建缓存。
  页面输出缓存适用于那些数据量较多,而不会进行过多的事件操作的页面,如果一个页面需要执行大量的事件更新,以及数据更新,则并不能使用页面输出缓存。使用@OutputCatch指令能够声明页面输出缓存,示例代码如下所示。
+展开
-HTML
<%@ OutputCache Duration="120" VaryByParam="none" %>

  上述代码使用@OutputCatch指令声明了页面缓存,该页面将被缓存120秒。@OutputCatch指令包括10个属性,通过这些属性能够分别为页面的不同情况进行缓存设置,常用的属性如下所示:
1)CacheProfile:获取或设置OutputCacheProfile名称。
2)Duration:获取或设置缓存项需要保留在缓存中的时间。
3)VaryByHeader:获取或设置用于改变缓存项的一组都好分隔的HTTP标头名称。
4)Location:获取或设置一个值,该值确定缓存项的位置,包括Any、Clint、Downstream、None、Server和ServerAndClient。默认值为Any。
5)VaryByControl:获取或设置一簇分好分隔的控件标识符,这些标识符包含在当前页或用户控件内,用于改变当前的缓存项。
6)NoStore:获取或设置一个值,该值确定是否设置了“Http Cache-Control:no-store”指令。
7)VaryByCustom:获取输出缓存用来改变缓存项的自定义字符串列表。
8)Enabled:获取或设置一个值,该值指示是否对当前内容启用了输出缓存。
9)VaryByParam:获取查询字符串或窗体POST参数的列表。
  通过设置相应的属性,可以为页面设置相应的缓存,当需要为Default.aspx设置缓存项时,可以使用VaryByParam属性进行设置,示例代码如下所示。
+展开
-HTML
<%@ OutputCache Duration="120" VaryByParam="none" %>

  上述代码使用了Duration属性和VarByParam属性设置了当前页的缓存属性。为一个页面进行整体的缓存设置往往是没有必要的,常常还会造成困扰,例如Default.aspx?id=1和Default.aspx?id=100在缓存时可能呈现的页面是相同的,这往往不是开发人员所希望的。通过配置VarByParam属性能够指定缓存参数,示例代码如下所示。
+展开
-HTML
<%@ OutputCache Duration="120" VaryByParam="id" %>

  上述代码则通过参数id进行缓存,当id项不同时,ASP.NET所进行的页面缓存也不尽相同。这样保证了Default.aspx?id=1和Default.aspx?id=100在缓存时所显示的页面并不一致。VarByHeader和VarByCustom主要用于根据访问页面的客户端对页面的外观或内容进行自定义。在ASP.NET中,一个页面可能需要为PC用户和MOBILE用户呈现输出,因此可以通过客户端的版本不同来缓存不同的数据,示例代码如下所示。
+展开
-HTML
<%@ OutputCache Duration="120" VaryByParam="none" VaryByCustom="browser" %>

  上述代码则为每个浏览器单独设置了缓存条目。

13.3.3 页面部分缓存
  整页缓存在很多情况是不可行的,例如在留言本程序中。当用户第一次访问该页面,该页面就会被缓存在服务器内存中,当用户进行评论并进行刷新,当前页面还在缓存的生存周期中,页面不会立即显示刚才用户发表的评论,这种情况可能造成用户困扰。在这种情况下,就应该针对页面中不同的部分进行缓存,如对用户评论框进行缓存或数据绑定控件进行和HTML控件进行缓存,这样也可以减少数据操作次数。示例代码如下所示
+展开
-HTML
<%@ OutputCache Duration="120" VaryByParam="*"%>

  上述代码将缓存用户控件120秒,并且将针对查询字符串的每个变动进行缓存。
+展开
-HTML
<%@ OutputCache Duration="120" VaryByParam="none" VaryByCustom="browser" %>

  上述代码针对浏览器设置缓存条目并缓存120秒,当浏览器不同时,则会分别创建独立的缓存条目。
+展开
-HTML
<%@ OutputCache Duration="120" 
VaryByParam="none" VaryByCustom="browser" VaryByControl="TextBox1"%>

  上述代码将服务器控件TextBox1的每个不同的值进行缓存处理。页面部分缓存是指输出存在页面的某些部分,而不是缓存整个页面的内容。页面部分缓存包括3种方法:
1)使用@OutputCatch指令声明方式为用户控件设置缓存功能。
2)在代码隐藏文件中使用PartialCachingAttribute类设置用户控件缓存。
3)使用ControlCachePolicy类以编程的方式指定用户缓存。
  页面部分缓存与页面缓存在很多方面都很相似,其属性基本相同,页面部分缓存主要使用@ OutputCache对象的属性进行缓存设置。
  当对页面进行页面缓存时,通常需要针对不同的POST参数进行缓存,如果不针对参数单独的进行缓存,则形成应用程序错误,而这种错误不是逻辑上的错误,如http://localhost/Default.aspx?user=guojing所呈现的页面和http://localhost/Default.aspx?user=wujunmin会给用户呈现相同的页面,就会导致用户困扰。使用VaryByParam属性可以解决这个问题,示例代码如下所示。
+展开
-HTML
<%@ OutputCache Duration="120" VaryByParam="name"%>

当存在多个POST参数时,可以用都好分隔,示例代码如下所示。
+展开
-HTML
<%@ OutputCache Duration="120" VaryByParam="name"%>

当需要为每个执行的变动进行缓存时,可以使用*进行缓存设置,示例代码如下所示。
+展开
-HTML
<%@ OutputCache Duration="120" VaryByParam="*"%>

  页面部分缓存通常应用于用户控件而不是Web窗体,除了Location属性,支持所有OutputCache属性。用户控件还支持名为VaryByControl的OutputCatch属性,该属性将根据用户控件的成员的值改变该控件的缓存。如果一个用户控件不随应用程序中的页面而改变,则需要使用Shared=”true”参数。

13.3.4 应用程序数据缓存
  应用程序缓存是由Cache类实现的,每个应用程序对象可以专用一个缓存实例。缓存生存期依赖于应用程序的生存期,如果应用程序重启,则会重新创建Cache对象。
1.创建Cache对象
  应用程序数据缓存是由System.Web.Caching.Cache类实现。该类提供了简单的字典接口。通过这个接口可以设置缓存的有效期、依赖项以及优先级等特性。Cache对象的属性如下所示:
1)Count:获取存储在缓存中的Cache对象的项数。
2)Item:获取或设置指定外键的缓存项。
  Cache对象的方法如下所示。
1)Add:将指定的项添加到Cache对象,该对象具有依赖项,过期和优先级策略,以及一个委托。
2)Get:从Cache对象检索指定项。
3)Remove:从应用程序的Cache对象移除指定项。
4)Insert:向Cache对象插入一个新项。
  Cache方法最简单的赋值方法就是使用一个键并为其赋值,示例代码如下所示。
+展开
-C#
Cache["key"] = "value";//创建缓存项

  增加缓存同样可以使用Cache对象的Add方法向缓存添加项。Add方法能够设置与Insert方法相同的所有选项。使用Add方法将返回添加到缓存中的对象,如果在缓存中已经存在该项,则Add方法不会替换该项,所以该操作不会产生异常。
  使用Add方法需要为Add方法传递参数,这些参数包括依赖项、过期时间和缓存的优先级策略等。若只需要实现创建Cache方法,推荐使用Cache对象的Insert方法,示例代码如下所示。
+展开
-C#
Cache.Insert("key""value"); //插入缓存项

  上述代码将在缓存中存储项,但是上述代码不带任何的依赖项,所以该缓存不会到期,除非缓存引擎为了给其他的缓存数据提供空间而将其删除,如果需要创建包含依赖项的缓存,则需要使用Add方法。
2.创建带依赖项的Cache对象
  创建Cache对象可以通过依赖项创建对象,使用Cache.Insert方法创建缓存不带任何依赖项,所以该缓存不会到期。如果需要创建带依赖项的Cache对象,可以使用Cache.Insert方法的重载函数,示例代码如下所示。
+展开
-C#
Cache.Insert("key","xml file value",  new System.Web.Caching.CacheDependency(Server.MapPath("XmlData.xml")));//插入缓存项

  上述代码将“xml file value”字符创插入缓存,无需在以后的请求中从文件读取缓存信息。CacheDependency的作用是确保缓存在文件更改后立即到期,从而能够从文件中提取最新的数据进行数据缓存,如果缓存数据来自若干个文件,还可以指定一个文件名数组,示例代码如下所示。
+展开
-C#
       string[] dependencies = { "CacheItem1""CacheItem2""CacheItem3" };//指定数组
       Cache.Insert("key","xml file value",
       new System.Web.Caching.CacheDependency(null,dependencies));//插入缓存项

  创建带依赖项的Cache对象时,可以同时创建多个依赖项。该Cache对象向缓存中名为CacheItem1等数组配置节的另一项添加依赖项,同时也向XmlData.xml文件添加文件依赖项,示例代码如下所示。
+展开
-C#
       System.Web.Caching.CacheDependency 
       mydep1 = new System.Web.Caching.CacheDependency(Server.MapPath("XmlData.xml"));//创建缓存
       string[] Mydependencies = { "CacheItem1""CacheItem2""CacheItem3" };//创建数组
       System.Web.Caching.CacheDependency 
       mydep2 = new System.Web.Caching.CacheDependency(null, Mydependencies);//创建依赖
       System.Web.Caching.AggregateCacheDependency 
       aggDep = new System.Web.Caching.AggregateCacheDependency();//创建依赖
       aggDep.Add(mydep1);//增加依赖
       aggDep.Add(mydep2);
       Cache.Insert("Cache""CacheItem", aggDep);//插入缓存

  上述代码创建了Cache对象,并向CacheItem1等数组配置节的另一项添加依赖项,同时也向XmlData.xml文件添加文件依赖项。

13.3.5 检索应用程序数据缓存对象
  要从缓存中检索数据,应指定存储缓存项的键。由于缓存中所存储的信息容易丢失,即该缓存信息有可能被ASP.NET移除,因此开发人员首先应该确定该项是否已经存在与缓存,如果不存在缓存,则首先应该创建一个缓存项,然后再检索该项。示例代码如下所示。
+展开
-C#
            string cache = Cache["key"].ToString();//获取缓存
            if (cache != null)//判断缓存
            {
                Response.Write(cache); //输出缓存
            }
            else
            {
                Cache["key"] = "value"; //创建缓存
                Response.Write(Cache["key"].ToString());//输出缓存
            }

  上述代码从缓存项“key”中获取缓存的值,如果缓存的值为空置,则创建一个缓存。使用Cache类的Get方法也可以获取被缓存的数据对象,如果通过Get方法返回缓存中的数据对象,则返回的类型为object类型,示例代码如下所示。
+展开
-C#
            string cache = Cache["key"].ToString();//获取缓存
            if (cache != null)//判断缓存
            {
                Response.Write(cache);//输出缓存
            }
            else
            {
                Cache["key"] = "value"; //创建缓存
                Response.Write(Cache.Get("key").ToString());//Get缓存
            }

  Cache类的Get方法可以获取被缓存的数据对象,如果使用Cache类的GetEnumerator方法则返回一个IDictionaryEnumerator对象,该对象可以用于循环访问包含在缓存中的键值设置及其值的枚举类型。示例代码如下所示。
+展开
-C#
            IDictionaryEnumerator cacheEnum = Cache.GetEnumerator();//定义枚举
            while (cacheEnum.MoveNext()) //遍历枚举
            {
                cache = Server.HtmlEncode(cacheEnum.Current.ToString());//输出缓存
                Response.Write(cache);
            }

  上述代码则通过使用Cache类的GetEnumerator方法则返回一个IDictionaryEnumerator对象给cacheEnum变量,并通过cacheEnum变量的MoveNext方法进行缓存遍历。

加支付宝好友偷能量挖...


评论(0)网络
阅读(122)喜欢(0)Asp.Net/C#/WCF