一,System .Web.Caching与缓存工作机制简介
System.Web.Caching是用来管理缓存的命名空间,其父级空间是System.Web,由此可见,缓存通常用于Web网站的开发,包括在B/S项目中的开发。
缓存的设计主要是考虑到网络带宽可能会延缓数据的提交与回发,如果把数据保存在客户端,用户就可以直接从客户端读取数据,减少客户端与服务器端的数据交互,提高程序的性能。
缓存命名空间中的类及其说明:
其中,缓存任何对象都使用类Cache,但当缓存发生改变时,普通对象与数据库对象的依赖处理不同,分别对应以上两个依赖。
下图展示了三层结构中缓存的工作机制:
二,管理缓存的类:Cache
1.功能说明
Cache类属于字典类(键-值对),其根据一定的规则存储用户需要的数据,这些数据的类型不受限制,缓存的数据可以是字符串,数组,数据表,自定义类等等。
使用Cache类的优点是当缓存的数据发生变化时,Cache类会让当前缓存数据失效,并实现缓存数据的重新添加,然后通知应用程序,报告缓存的及时更新。
2.语法定义
Cache类的语法定义如下:
public sealed class Cache : IEnumerable
通过定义发现,Cache类是sealed密封的类,不能被集成。同时Cache继承了IEnumerable接口,允许对集合中的数据进行枚举操作。
缓存的生命周期随着应用程序域的活动结束而终止,也就是说只要应用程序域依然出于活动状态,缓存就一直会保持,因为每个应用程序域都会创建一个缓存实例。此实例的信息可以通过HttpContext对象,Page对象的Cache属性获取。
3.方法详解
Cache类的方法主要提供对缓存数据的编辑操作:
最需要注意的是Add方法的参数,其使用语法如下:
public object Add( string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback );
特别有一点要提一下,绝对到期和可调到期只能指定一个,
使用绝对到期,则可调到期值必须为System.Web.Caching.Cache.NoSlidingExpiration,禁用可调到期。
反之,使用可调到期,则绝对到期的值必须为System.Web.Caching.Cache.NoAbsoluteExpiration,禁用绝对到期。
Insert方法和Add方法的参数是一样的,不过Insert方法提供了更多的重载,如果你不提供某个值,那这个值就会被设置为默认值。
下面的例子演示了Cache的基本用法:
代码中使用了ArrayList,所有别忘记了添加”System.Collections“命名空间的引用,当然使用Cache,别忘记了添加”System.Web.Caching“.
4.属性详解
Cache类的属性主要用来获取缓存数据的一些基本信息,这里主要介绍Count和Item属性。
Count用来获取缓存中所有缓存项的总数:
Response.Write(Cache.Count);//缓存项总数
Item用于返回制定项的内容,前面其实已经演示过了,一般继承”IEnumerable“接口的类都有这样的属性,使用[]来包装,用法如下:
Response.Write(Cache["League"]);
三,典型应用,实现数据缓存的快速读取
Cache主要用来缓存使用频率高且不需经常更新的数据。我们来做一个球员列表的缓存,为了演示方便,假设不从数据库中读取数据,而是存在一个ArrayList对象中。
1.首先在打开VisualStudio创建一个ASP.NET网站,命名为”JohnConnor.CacheSample“。
2.打开默认生成的Default.aspx页,在设计视图中添加一个下拉列表框和一个按钮。
3.切换到页面的代码视图,不要忘记添加命名空间的引用喔。
using System.Collections; using System.Web.Caching;
4.在”Page_Loda“事件中判断是否存在球员列表缓存,如果没有,则将球员列表添加到缓存中。详细代码如下:
5.然后我们在按钮的双击事件中判断是否有球员列表的缓存,有则显示列表内容,没有则清空下拉框:
现在F5运行程序,因为我们设定的是可调到期10秒,可就是说距离最后一次访问10秒后,缓存就会失效。
我们在一开始10秒内点击按钮,球员列表就会被绑定到下拉框。
但之后的10秒内无动作,再点击的话,下拉框就会被清空。因为缓存已经失效了。
这一篇是缓存管理的第一篇,我们介绍了System.Web.Caching命名空间和其下Cache类的使用方法,并没有涉及缓存依赖的内容。
当实际数据改变的时候,如果缓存不发生改变,那是很糟糕的事情,随后的两篇将会介绍通过依赖项来实现缓存数据的即时更新。希望大家捧场。