什么是Cache对象?
你在生成高性能网络应用程序时所遇到的一个问题就是需要避免重复。一个Cache对象允许在它们第一次被请求时在内存中缓存项,然后将被缓存的副本用于以后的请求。使用被缓存的副本允许你避免重建满足以前请求的信息,特别是那些每次创建时都需占有明示的服务器上的处理器时间的命令。
除缓存个别项,如缓存中的计算结果以外,Asp.net提供一个输出缓存可用于保存网页和用户控件。Cache对象和输出缓存是拥有相同的角色和属性,但它们是皆然不同的两种对象。
ASP.NET提供一个全特性的缓存引擎,用于保存和获取信息片段。Cache对象没有关于它所包含的的项的信息。Cache对象仅包含对于那些对象的引用以及提供它们的依赖项和设置过期策略。Cache还提供方法在相同网络应用程序的网页之间传递值。缓存方法实现自动的锁,所以,值在被多个页并发访问时是安全的。
那么Cache对象是如何工作的哪?
使用Cache对象的的过程是:
1. 页面请求的项被标识为已经在Cache对象中保存。
2. ASP.NET 检查 Cache 对象并用已缓存的版本来决定是否可用。
3. 如果缓存的版本不可用,ASP.NET 重新创建项,使用此项,然后将它保存在Cache对象以备后用。
我们如何使用Cache对象的键值对?
Cache对象使用键值对保存和获取对象。键是缓存键字符串,用于引用对象。值是被缓存的对象。在最简单的例子中,将项放到缓存中再获取它就像是将某项被放到字典中。
要想将项添加到Cache对象: Cache["mykey"] = myValue;
要想从Cache对象中获取项: myValue = Cache["mykey"];
代码示例如下:
DataTable dt = new DataTable();
…………………………………………
Cache["ObjDataTable"] = dt; 将一个DataTable缓存到Cache对象中。
DataTable dt = new DataTable();
dt = Cache["ObjDataTable"] as DataTable; 将被保存在缓存中DataTable从缓存中获取。
ASP.NET Cache 对象设计用于保证它并不使用过多的服务器内存。结果是,当用内存变得缺乏时,Cache对象自动删除最少被使用的项。你可以通过定义时间限制、依赖项、以及项
在Cache对象中的优先级来影响 Cache对象保存和删除项的方式。
Cache对象中的项只要是依赖或时间限制被触发,就是立即被删除。试图获取被删除的项将返回null值,除非项再次被添加到 Cache对象中。
绝对期限
你可以使用 AbsoluteEXpiration 参数为项定义最大的绝对生存期。此参数是 DateTime 类型的参数,允许你指定项过期的时间。
我在下面的代码指定了从创建起5分钟后,myValue 从 Cache 对象中被删除:
Cache.Insert("myKey", myValue, null, DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration);
滑动期限
你可以通过使用 SlidingExpiration 参数为项定义最大的相对生存期。这是一个 TimeSpan 类型参数,允许你指定每个对象自从最后一次访问后的时间间隔以及何时对象到期。
我在下面的代码指定了 myValue 最后的访问的20分钟后被从 Cache对象中删除:
Cache.Insert("myKey", myValue, null, null, TimeSpan.FromSeconds(20));
依赖项
有时你想某对象从 Cache对象中被删除,因为支持的项,如文件已经改变。ASP.NET 允许你基于依赖项或另一个缓存的项来定义缓存项的合法性。基于外部文件和目录的依赖项被
称为文件依赖项,依赖于另一个缓存项的依赖项被称为键依赖项。如果依赖项改变,缓存的项被称为不合法,然后从Cache对象中删除。
我在下面的代码指定了当 myDoc.xml 文件更改时,myValue 从 Cache对象中删除:
Cache.Insert("myKey", myValue, new CacheDependency(Server.MapPath("myDoc.xml")));
缓存项优先级
当网络服务器运行的内存可用量降低时,Cache对象有选择地删除项以释放系统内存。你指定高一点优先级的项较低可能从缓存中被删除,而被指定为低一些优先级的项被删除的可能性就要大一些。
我在下列代码指定了 myValue 有高优先级,将成为当服务器内存被限制时,最后从 Cache对象删除的项之一:
Cache.Insert("myKey", myValue, null, null, Cache.NoSlidingExpiration, CacheItemPriority.High, onRemove);
设置 Cache.Insert 中参数的示例
下列代码将一个 MyBook 的值使用许多参数插入到了 Cache对象中。下列首先发生的依赖项或超 时事件将使项被从 Cache对象中删除:
在保存5分钟后被删除。
在最后访问30秒钟后被删除。
在 Books.xml 文件更改后删除。
将项的优先级设置为高,从而如果服务器资源成为问题时最后被删除。
当项被从 Cache对象删除时,回调函数onRemove 运行。
Cache.Insert("MyBook.CurrentBook", CurrentBook, new CacheDependency(Server.MapPath("")), DateTime.Now.AddMinutes(5), TimeSpan.FromSeconds(30), CacheItemPriority.High, onRemove);
======================================
ASP.NET 为您提供了一个强大的、便于使用的缓存机制,用于将需要大量服务器资源来创建的对象存储在内存中。缓存这些类型的资源会大大改进应用程序的性能。
缓存是由 Cache 类实现的;缓存实例是每个应用程序专用的。缓存生存期依赖于应用程序的生存期;重新启动应用程序后,将重新创建 Cache 对象。
设计 Cache 类是为了便于使用。您可以将项放置在 Cache 中,并在以后使用简单的键/值对来检索这些项。
Cache 类提供了强大的功能,允许您自定义如何缓存项以及将它们缓存多长时间。例如,当缺乏系统内存时,缓存会自动移除很少使用的或优先级较低的项以释放内存。该技术也称为清理,这是缓存确保过期数据不使用宝贵的服务器资源的方式之一。
当执行清理时,您可以指示 Cache 给予某些项比其他项更高的优先级。若要指示项的重要性,可以在使用 Add 或 Insert 方法添加项时指定一个 CacheItemPriority 枚举值。
当使用 Add 或 Insert 方法将项添加到缓存时,您还可以建立项的过期策略。您可以通过使用 DateTime 值指定项的确切过期时间(绝对过期时间),来定义项的生存期。也可以使用 TimeSpan 值指定一个弹性过期时间,弹性过期时间允许您根据项的上次访问时间来指定该项过期之前的运行时间。一旦项过期,便将它从缓存中移除。试图检索它的值的行为将返回 null(在 Visual Basic 中为 Nothing),除非该项被重新添加到缓存中。
对于存储在缓存中的易失项(例如那些定期进行数据刷新的项或那些只在一段时间内有效的项),通常设置一种过期策略:只要这些项的数据保持为最新的,就将它们保留在缓存中。例如,如果您正在编写一个应用程序,该应用程序通过另一个网站获取数据来跟踪体育比赛的比分,那么只要源网站上比赛的比分不更改,就可以缓存这些比分。在此情况下,您可以根据其他网站更新比分的频率来设置过期策略。您可以编写代码来确定缓存中是否是最新的比分。如果该比分不是最新的,则代码可以从源网站读取比分并缓存新值。
最后,ASP.NET 允许您根据外部文件、目录(文件依赖项)或另一个缓存项(键依赖项)来定义缓存项的有效性。如果具有关联依赖项的项发生更改,缓存项便会失效并从缓存中移除。您可以使用该技术在项的数据源更改时从缓存中移除这些项。例如,如果您编写一个处理 XML 文件中的财务数据的应用程序,则可以从该文件将数据插入缓存中并在此 XML 文件上保留一个依赖项。当该文件更新时,从缓存中移除该项,您的应用程序重新读取 XML 文件,然后将刷新后的数据放入缓存中。
将项添加到缓存中
可以使用 Cache 对象访问应用程序缓存中的项。可以使用 Cache 对象的 Insert 方法向应用程序缓存添加项。该方法向缓存添加项,并且通过几次重载,您可以用不同选项添加项,以设置依赖项、过期和移除通知。如果使用 Insert 方法向缓存添加项,并且已经存在与现有项同名的项,则缓存中的现有项将被替换。
还可以使用 Add 方法向缓存添加项。使用此方法,您可以设置与 Insert 方法相同的所有选项;然而,Add 方法将返回您添加到缓存中的对象。另外,如果使用 Add 方法,并且缓存中已经存在与现有项同名的项,则该方法不会替换该项,并且不会引发异常。
通过键和值直接设置项向缓存添加项
通过指定项的键和值,像将项添加到字典中一样将其添加到缓存中。
下面的代码示例将名为 CacheItem1 的项添加到 Cache 对象中:
Cache["CacheItem1"] = "Cached Item 1";
通过使用 Insert 方法将项添加到缓存中
调用 Insert 方法,传递要添加的项的键和值。
下面的代码示例添加名为 CacheItem2 的字符串:
Cache.Insert("CacheItem2", "Cached Item 2");
通过指定依赖项向缓存添加项
调用 Insert 方法,将 CacheDependency 对象的一个实例传递给该方法
下面的代码示例添加名为 CacheItem3 的项,该项依赖于缓存中名为 CacheItem2 的另一个项:
string[] dependencies = { "CacheItem2" };
Cache.Insert("CacheItem3", "Cached Item 3",
new System.Web.Caching.CacheDependency(null, dependencies));
下面的代码示例演示将名为 CacheItem4 的项添加到缓存中,并且在名为 XMLFile.xml 的文件上设置文件依赖项:
Cache.Insert("CacheItem4", "Cached Item 4",
new System.Web.Caching.CacheDependency(
Server.MapPath("XMLFile.xml")));