




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
cache缓存介绍分析及用法说明缓存主要是为了提高数据的读取速度。因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能。 本章从缓存所在的命名空间“System.Web.Caching”开始,详细介绍框架提供的缓存类和操作方法,主要涉及简单数据的缓存、数据缓存依赖和数据库缓存依赖三个技术要点,最后演示一个完全使用缓存实现数据读取的实例。讲解流程如图16-1所示。 :16.1 System.Web.Caching简介本节从缓存命名空间的总体简介和组成结构入手,从整体上对System.Web.Caching进行概述。16.1.1 System.Web.Caching概述System.Web.Caching是用来管理缓存的命名空间。缓存就是将服务器端的数据暂时保存在客户端,方便用户的读取。缓存命名空间的父级空间是 “System.Web”,由此可以看出,缓存通常用于Web网站的开发,包括在B/S项目中的开发。缓存的设计主要是考虑到网络带宽可能会延缓数据的提 交和回发,如果将数据保存在客户端,用户可以直接从客户端读取数据,这样数据就是从本地提取的,不会再受网络的影响。System.Web.Caching命名空间提供与缓存有关的所有操作类,具体包括哪些类将在下一节详细介绍。16.1.2 System.Web.Caching命名空间内的类组成缓存命名空间主要提供三种操作:缓存数据对象、对象的缓存依赖和数据库的缓存依赖。其中缓存任何对象都使用一个类Cache,但当缓存发生改变时,普通对象和数据库对象的依赖处理不同。图16-2罗列的是在三层结构中缓存的部署情况。两个依赖类CacheDependency和SqlCache Dependency主要更改发生变化的缓存数据,起到通知的作用。当数据没有被缓存时,使用Cache类进行添加。下面根据图16-2的部署,来介绍图中使用的缓存类。这些类的说明如表16-1所示。图16-2 三层结构中缓存的部署图表16-1 缓存命名空间中的类及其说明Cache对缓存对象的编辑类,其操作包括缓存的增、删、改CacheDependency基本缓存对象的依赖,当基本对象发生变化时,更新缓存内容SqlCacheDependency数据库缓存对象的依赖,当数据库中的数据变化时,更新缓存内容16.2 管理缓存的类:Cache类Cache类用来存储数据对象,并提供方法对这些对象进行编辑。本节主要介绍Cache类包含的方法,以及如何使用这些方法实现数据对象的缓存。16.2.1 功能说明Cache类属于字典类,其根据一定的规则存储用户需要的数据,这些数据的类型不受限制,可以是字符串、数组、数据表、Dataset和哈希表等。使用Cache类的优点是当缓存的数据发生变化时,Cache类会让数据失效,并实现缓存数据的重新添加,然后通知应用程序,报告缓存的及时更新。16.2.2 语法定义Cache类的语法定义如下:public sealed class Cache : IEnumerable通过其定义可以发现,Cache类是“sealed”定义的类,表示此类被密封,不能被继承。同时Cache类还继承了IEnumerable接口,表示允许对集合中的数据进行枚举操作。缓存的生命周期随着应用程序域的活动结束而终止,也就是说只要应用程序域依然处于活动状态,缓存就会一直保持,因为每个应用程序域都会创建一个缓存实例。此实例的信息通过HttpContext对象的Cache属性或Page对象的Cache属性获取。下面的代码演示如何将数组数据添加到缓存中:ArrayList myarray = new ArrayList(); /创建数组数据myarray.Add(1.学习园地);myarray.Add(2.交流论坛);myarray.Add(3.帮助);Cache.Add(Category, myarray); /将数组添加到缓存中16.2.3 方法详解Cache类的方法主要提供对缓存数据的编辑操作,如增、删、改等。其中最常用的方法及其说明如表16-2所示。表16-2 Cache类的主要方法及其说明Add将数据添加到Cache对象Insert向Cache中插入数据项,可用于修改已经存在的数据缓存项Remove移除Cache对象中的缓存数据项Get从Cache对象中获取指定的数据项,注意返回的是Object类型,需要进行类型转换GetType从Cache对象中获取数据项的类型,判断数据类型后,方便进行转换GetEnumerator循环访问Cache对象中的缓存数据项。注意其返回类型是“IDictionaryEnumerator”技巧:要想修改缓存数据,只需要重新为缓存赋值即可。最需要注意的是Add方法,其使用语法如下:public Object Add ( string key, Object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback)在使用Add方法时,以上7个参数是必需的,其代表意义如下: 参数“key”代表缓存数据项的键值,必须是唯一的。 参数“value”代表缓存数据的内容,可以是任意类型。 参数“dependencies”表示缓存的依赖项,也就是此项的更改意味着缓存内容已经过期。如果没有依赖项,可将此值设置为NULL。 参数“absoluteExpiration”是日期型数据,表示缓存过期的时间,.NET 2.0提供的缓存在过期后是可以使用的,能使用多长时间,就看这个参数的设置。 参数“slidingExpiration”的类型表示一段时间间隔,表示缓存参数将在多长时间以后被删除,此参数与absoluteExpiration参数相关联。 参数“priority”表示撤销缓存的优先值,此参数的值取自枚举变量“CacheItemPriority”,优先级低的数据项将先被删除。此参数主要用在缓存退出对象时。 参数“onRemoveCallback”表示缓存删除数据对象时调用的事件,一般用做通知程序。下面的代码演示了如何应用Cache类的这些方法。在使用本代码时需要注意,代码中使用了Arraylist对象,所以需要添加对命名空间 “System.Collections”的引用,同时使用Cache类别忘记了添加命名空间“System.Web.Caching”。 protected void Page_Load(object sender, EventArgs e) ArrayList myarray = new ArrayList(); /创建数组数据 myarray.Add(1.学习园地); myarray.Add(2.交流论坛); myarray.Add(3.帮助); /将数组添加到缓存中使用Add方法 Cache.Add(Category, myarray, null, DateTime.Now.AddSeconds(60), TimeSpan.Zero, CacheItemPriority.Normal, null); myarray1 = 2.交流园地; /修改数组数据 Cache.Insert(Category, myarray); /使用Insert方法修改缓存数据 string tmpStr = 这是一个临时数据; Cachetmpdata = tmpStr; /使用Get方法获取缓存数据 Response.Write(Cache.Get(tmpdata).ToString()+);/ Cachetmpdata = 这是一个临时字符串; /重新为缓存赋值的技巧 Response.Write(Cache.Get(tmpdata).ToString() + ); /使用GetType方法判断缓存数据的类型 if (CacheCategory.GetType().Name = ArrayList) Response.Write(类型是数组); /使用GetEnumerator方法遍历缓存中的数据 IDictionaryEnumerator mycache = Cache.GetEnumerator(); while (mycache.MoveNext() Response.Write(mycache.Value + ); Cache.Remove(tmpdata);/使用Remove方法移除缓存的临时数据技巧:在使用GetType方法时,如果要判断类型,需要使用Object.GetType().Name属性获取类型的名称。上述代码的运行结果如下:这是一个临时数据这是一个临时字符串类型是数组这是一个临时字符串System.Collections.ArrayList其中在读取类型为ArrayList的数据时,由于没有进行类型转换,所以取出的是类型为“System.Collections.ArrayList”的对象。本书会在本节最后的实例中介绍如何读取数组的详细内容。16.2.4 属性详解Cache类的属性主要用来获取缓存数据的一些基本信息,如缓存的项总数、指定位置的缓存项等。本书主要介绍两个属性:Count和Item。Count用来获取缓存中所有的项的总数。使用方法如下:Response.Write(Cache.Count);Item用于返回指定项的内容,一般继承“IEnumerable”接口的类都有这样的属性,注意项需要使用“ ”包装。其使用方法如下:Response.Write(Cache“Category”.ToString();16.2.5 典型应用:实现数据的缓存快速读取功能Cache主要用来缓存使用频率高且不需经常更新的数据。本例实现一个目录列表的缓存。为了简便,列表的内容并没有从数据库中读取,而是保存在一个ArrayList对象中。本例的目的是将目录列表填充到下拉框中,当缓存失效后,目录列表的内容为空。演示的步骤如下所述。 在VS2005中创建一个网站,命名为“CacheSample”。 打开默认生成的Default.aspx页,在其中添加一个下拉列表框和一个按钮。 按F7键切换到页面的代码视图。不要忘记对命名空间的引用,代码如下:using System.Web.Caching;using System.Collections; 在“Page_Load”事件中判断是否存在目录缓存,如果没有,则将目录添加到缓存中。详细代码如下所示,其中目录列表的保存时间是5秒。protected void Page_Load(object sender, EventArgs e) if (!Page.IsPostBack) ArrayList myarray = new ArrayList();/假设ArrayList的内容来自数据库 myarray.Add(古代历史); myarray.Add(当代文学); myarray.Add(流行小说); myarray.Add(武侠小说); if (CacheCategorys = null) /判断是否存在缓存 /如果缓存不存在,则添加保存时间是5秒 Cache.Add(Categorys, myarray, null, DateTime.Now.AddSeconds(5), TimeSpan.Zero, CacheItemPriority.Normal, null); 回到设计视图,双击按钮控件,切换到按钮的事件代码中。 在按钮的双击事件中,需要判断是否有目录的缓存,有则在下拉框中显示目录内容,没有则清空下拉框。详细代码如下:protected void Button1_Click(object sender, EventArgs e) if (CacheCategorys != null) /判断缓存是否失效 /如果没有失效,则取出缓存的列表,注意类型的转换。 DropDownList1.DataSource = (ArrayList)CacheCategorys; DropDownList1.DataBind(); else DropDownList1.Items.Clear(); /如果已经失效,则清空列表 按Ctrl+S组合键保存所有的代码,再按F5键运行程序。在5秒以内如果单击按钮,则正常显示目录列表,如果超过5秒,则缓存对象已经不存在,所以下拉列表框的内容为空。本节主要介绍了Cache类的使用方法,其中并没有涉及缓存依赖内容,即当实际数据改变时,缓存是否随着改变。下一节将通过学习“CacheDependency”类了解缓存依赖的详细实现。16.3 缓存依赖类:CacheDependency类CacheDependency类是架设在Cache类和实际数据之间的桥梁。本节将详细介绍如何利用CacheDependency类实现数据缓存的及时更新。16.3.1 功能说明CacheDependency类被称为是缓存依赖类,其具体意义表现在当缓存对象的实际数据发生改变时,它能及时通知缓存对象。例如缓存对象 “Category”保存的是一个XML文件的数据,如果XML文件发生了变化,那么系统通过CacheDependency类就会及时更新缓存对象 “Category”的内容,这样就能保证用户读取的永远是最新的数据。16.3.2 语法定义CacheDependency类的语法定义如下:public class CacheDependency : IDisposable其中继承了接口“IDisposable”,此接口主要用来定义释放分配的非托管资源的方法。继承此接口必须实现方法Dispose,以实现资源的释放。CacheDependency类的构造函数实现了8个重载,下面的代码列出了这些重载的函数,并详细说明了各函数的参数。了解这些函数就可以知道CacheDependency究竟能为缓存带来什么优势。 /假设缓存的来源文件是当前目录下的data.xml文件 /缓存依赖的文件路径 CacheDependency mydep = new CacheDependency(data.xml); /缓存依赖的文件可以有多个 CacheDependency mydep1=new CacheDependency(new string data.xml,data1.xml); /检查缓存依赖更改的依据时间 CacheDependency mydep2 = new CacheDependency(data.xml, DateTime.Now); /检查多个依赖文件更改的依据时间 CacheDependency mydep3 = new CacheDependency(new string data.xml, data1.xml , DateTime.Now); /检查依赖多个文件,也依赖多个缓存键值 CacheDependency mydep4 = new CacheDependency(new string data.xml, data1.xml , new string Category, Category1 ); /关联依赖,还可以依赖于另一个文件缓存依赖 CacheDependency mydep5 = new CacheDependency(new string data.xml, data1.xml , new string Category, Category1 , mydep); /文件和键值上次修改的依据时间 CacheDependency mydep6 = new CacheDependency(new string data.xml, data1.xml , new string Category, Category1 , DateTime.Now); /文件、另一个缓存依赖和键值上次修改的依据时间 CacheDependency mydep6 = new CacheDependency(new string data.xml, data1.xml ,new string Category, Category1 , mydep,DateTime.Now);16.3.3 方法和属性虽然CacheDependency类完成了很重要的功能,但其组成结构却比较简单,主要有两个属性和一个方法。 属性“HasChanged”:判断CacheDependency对象是否已更改。 属性“UtcLastModified”:返回上次依赖项的修改日期 方法“Dispose”:释放CacheDependency对象所占有的资源。因为缓存类继承了接口“IDispose”,所以必须实现此方法。由于缓存类的构成比较简单,本节并没有给出演示代码,属性和方法的使用将在下一节的实例中演示。注意:只有Cache类的Insert和Add方法才可以为缓存添加依赖项。16.3.4 典型应用:用CacheDependency获取最新的数据本例主要演示如何使用CacheDependency类实现数据的及时更新。实例中使用一个GridView控件显示XML文件的数据,当XML文件的数据发生改变时,客户端可以及时更新。其实现的功能如图16-3所示。图16-3 用CacheDependency获取最新数据的功能实现图演示的详细步骤如下所述。 打开VS2005,创建一个网站,命名为“CacheDependencySample”。 在网站根目录下,添加一个XML文件,用来为控件提供数据,内容如下: 英国古代 28.00 中国历史 20.00 打开默认生成的Default.aspx页,添加一个GridView控件和一个按钮控件。 按F7键切换到窗体的代码视图,在Page_Load事件中书写生成缓存的代码。详细内容如下:private static CacheDependency mydepen;protected void Page_Load(object sender, EventArgs e) if (!IsPostBack) /创建XML数据源 DataSet myds = new DataSet(); /数据源来自文件data.xml myds.ReadXml(this.MapPath(Request.ApplicationPath + /data.xml); /判断是否存在缓存 if (CacheBOOKS = null) /创建缓存依赖 mydepen = new CacheDependency(this.MapPath(Request.ApplicationPath + /data.xml); /添加缓存项 Cache.Add(BOOKS, myds, mydepen, DateTime.Now.AddSeconds(10), TimeSpan.Zero, CacheItemPriority.Normal, null); 注意:使用XML文件读取方法,必须添加XML操作方法所在的命名空间“System.Xml”。 切换回设计视图,再双击按钮控件,此时光标停靠在按钮的Click事件内。在此事件内书写代码,判断XML文件的数据是否已更新,如果已更新则给出提示,并重新添加缓存依赖项,否则直接从缓存读取GridView控件的数据。 在“Button1_Click”事件内书写的详细代码如下:protected void Button1_Click(object sender, EventArgs e) /判断缓存是否发生了变化 if (mydepen.HasChanged) Response.Write(Sorry,数据发生了变化!上次修改时间是: + mydepen.UtcLastModified); /判断缓存项是否还在 if (CacheBOOKS = null) /重新设置缓存项 DataSet myds = new DataSet(); myds.ReadXml(this.MapPath(Request.ApplicationPath + /data.xml); mydepen = new CacheDependency(this.MapPath(Request.ApplicationPath + / data.xml); Cache.Add(BOOKS, myds, mydepen, DateTime.Now.AddSeconds(10), TimeSpan.Zero,CacheItemPriority.Normal, null); GridView1.DataSource = CacheBOOKS; GridView1.DataBind();注意:当XML文件发生改变后,其实缓存依赖和缓存项都被移除了,必须重新定义。 按Ctrl+S组合键保存代码的修改。再按F5键运行程序,单击“获取数据”按钮,GridView就会显示XML文件的内容。 程序运行正常后,在后台修改XML文件的内容,然后再单击“获取数据”按钮,则出现更改数据的提示,同时GridView显示了新的内容。图16-4和图16-5是数据更改前和更改后的效果对比。图16-4 初次获取的数据效果图 图16-5 更改数据后的显示效果图16.4 数据库缓存依赖类:SqlCacheDependency类数据库缓存依赖主要解决的是当数据库的内容发生改变时,如何及时通知缓存,并更新缓存中的数据的问题。本节就介绍如何使用SQL Server 2005和.NET 2.0实现数据库的缓存依赖。16.4.1 功能说明SqlCacheDependency类的使用需要结合SQL Server 2005数据库,目前还没有Oracle数据库的缓存依赖。16.4.2 语法定义SqlCacheDependency类的使用语法如下:public class SqlCacheDependency : IDisposable其中继承了接口“IDisposable”,此接口主要用来定义释放分配的非托管资源的方法。继承此接口必须实现方法Dispose,用来实现资源的释放。SqlCacheDependency类主要的构造函数如下:public SqlCacheDependency(string database,string table)其中参数一代表要启用缓存的数据库,参数二表示缓存的表。在实际使用过程中,只需要指明缓存的数据库和表即可。16.4.3 方法和属性SqlCacheDependency类的方法和属性同CacheDependency类相同,主要有三个。 HasChanged:判断数据库缓存依赖是否发生了变化。 UtcLastModified:获取缓存依赖上次更改的时间。 Dispose:释放缓存依赖所占用的资源。这三个成员的使用方法同CacheDependency类的成员相似,本节不再赘述。在下节要介绍的使用实例中,将不再使用代码的方式实现缓存依赖,而是使用“OutputCache”在.NET 2.0中提供的SqlCacheDependency参数实现数据库表的缓存。如果要使用编程的方式实现此功能,可参考CacheDependency类的实例。16.4.4 使用SqlCacheDependency类的操作流程要实现数据库缓存依赖,必须结合数据库的操作。在使用数据库缓存依赖前,必须进行5步操作。详细流程如图16-6所示。只有具备了上述条件,才可以正常地使用数据库缓存依赖。下一节将结合这5步操作演示如何实现数据库的缓存依赖。 创建数据库链接图16-6 使用数据库缓存依赖的流程16.4.5 典型应用:获取数据库表最新数据的实例 本例要实现的功能是当数据库的内容发生变化时,保存在缓存中的数据项被更新。具体演示的步骤如下所述。 在数据库中创建数据库“testCache”。 在数据库“testCache”中添加表“CacheTable”,其信息如表16-3所示。表16-3 CacheTable表的信息字 段 名 字段类型 说 明id int 自增长数据标识Namenvarchar(20) 书名bookPublish nvarchar(50) 出版社Pricedecimal(6,2)书的价格 为数据库启用缓存通知。打开“开始”|“所有程序”|“Microsoft Visual Studio 2005”|“Visual Studio Tools”|“Visual Studio 2005命名提示”菜单命令。 输入如下命令,其中“-ed”和“-et”分别代表启用缓存依赖数据库和启用缓存数据表。aspnet_regsql.exe -S CGJ-57F90CCA64CSQLEXPRESS -E -ed -d testCache -et -t CacheTable注意如果使用的数据库验证方式是“SQL Server身份验证”,则需要使用如下的启动命令:aspnet_regsql.exe -S CGJ-57F90CCA64CSQLEXPRESS -U -P -ed -d testCache -et -t CacheTable 输入命令后,按回车键。如果执行成功,效果如图16-7所示。 打开VS2005,新建一个网站,命名为“SqlCacheDependency”。 按F5键运行程序,主要目的是生成一个默认的Web.Config文件。然后关闭运行的程序。 在Web.config中配置数据库连接字符串,代码如下: 图16-7 启用数据库缓存依赖成功的提示图 在“system.web”节点内,添加数据库缓存依赖的配置,详细代码如下所示。注意配置中的“connectionStringName”属性,要与前面创建的数据库连接字符串的名字相对应。 按Ctrl+S组合键保存配置文件的更改。 打开默认生成的Default.aspx页,在设计视图中添加一个GridView控件,用来显示从数据库获取的数据。再添加一个Literal控件,主要用来显示时间,通过时间判断显示的是否是缓存中的数据。 为GridView配置数据源。单击其任务列表,在“选择数据源”下拉框中,单击“新建数据源”命令,打开数据源的配置向导。 在打开的数据源类型窗口中,选择“数据库”,单击“确定”按钮,出现选择连接字符串窗口,通过下拉列表选择刚刚创建的“TestCacheConnectionString”连接串。 单击“下一步”按钮,出现“配置Select语句”对话框,在“列”列表框中选择“*”,表示选中所有列。 单击“下一步”按钮出现测试查
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 橡胶膏剂抗菌食品包装-洞察及研究
- 封记管理制度
- 手指画梅花课件
- 手指宝宝做运动课件
- 预警系统实时性提升策略-洞察及研究
- 江苏省徐州市云龙区徐州培栋实验学校2025-2026学年四年级上学期9月月考数学试题(无答案)
- 贵州省遵义市航天高级中学2025-2026学年高三上学期第一次月考物理试卷(含答案)
- 2024-2025学年云南省昭通市人教版五年级下册期中综合素养测试数学试卷(含答案)
- 学生网络安全培训心得课件
- 手卫生课件教学
- 拔罐适应症研究-洞察及研究
- 2025《政务数据共享条例》法律法规课件
- Q-SY 02045-2024 柔性压裂管汇使用技术规范
- 华为干部晋升管理制度
- T/CACEM 31.5-2023高速公路经营管理第5部分:服务区服务要求
- 劳动技术-七年级上册-全册教案-湖南教育出版社
- 外贸矿产代理协议书
- 品质协议书范本
- 医院污水处理站服务外包项目投标方案(技术方案)
- 2024年全球及中国运动功能性针织面料行业头部企业市场占有率及排名调研报告
- 2025版预防接种规范
评论
0/150
提交评论