企业网站设计概念,天眼查个人查询入口,wordpress文章标题字体太大,天蒙旅游区网络营销推广方法本章导读 缓存主要是为了提高数据的读取速度。因为服务器和应用客户端之间存在着流量的瓶颈#xff0c;所以读取大容量数据时#xff0c;使用缓存来直接为客户端服务#xff0c;可以减少客户端与服务器端的数据交互#xff0c;从而大大提高程序的性能。 本章从缓存所在的命…本章导读 缓存主要是为了提高数据的读取速度。因为服务器和应用客户端之间存在着流量的瓶颈所以读取大容量数据时使用缓存来直接为客户端服务可以减少客户端与服务器端的数据交互从而大大提高程序的性能。 本章从缓存所在的命名空间“System.Web.Caching”开始详细介绍框架提供的缓存类和操作方法主要涉及简单数据的缓存、数据缓存依赖和数据库缓存依赖三个技术要点最后演示一个完全使用缓存实现数据读取的实例。讲解流程如图16-1所示。 图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); myarray[1] 2.交流园地; //修改数组数据 Cache.Insert(Category, myarray); //使用Insert方法修改缓存数据 string tmpStr 这是一个临时数据; Cache[tmpdata] tmpStr; //使用Get方法获取缓存数据 Response.Write(Cache.Get(tmpdata).ToString()br/);/ Cache[tmpdata] 这是一个临时字符串; //重新为缓存赋值的技巧 Response.Write(Cache.Get(tmpdata).ToString() br/); //使用GetType方法判断缓存数据的类型 if (Cache[Category].GetType().Name ArrayList) Response.Write(类型是数组); //使用GetEnumerator方法遍历缓存中的数据 IDictionaryEnumerator mycache Cache.GetEnumerator(); while (mycache.MoveNext()) Response.Write(mycache.Value br/); 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 (Cache[Categorys] 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 (Cache[Categorys] ! null) //判断缓存是否失效 { //如果没有失效则取出缓存的列表注意类型的转换。 DropDownList1.DataSource (ArrayList)Cache[Categorys]; DropDownList1.DataBind(); } else { DropDownList1.Items.Clear(); //如果已经失效则清空列表 } } 按CtrlS组合键保存所有的代码再按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 mydep1new 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文件用来为控件提供数据内容如下 ?xml version1.0 encodingutf-8 ? book bookinfo name英国古代/name price28.00/price /bookinfo bookinfo name中国历史/name price20.00/price /bookinfo /book 打开默认生成的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 (Cache[BOOKS] 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 (Cache[BOOKS] 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 Cache[BOOKS]; GridView1.DataBind(); } 注意当XML文件发生改变后其实缓存依赖和缓存项都被移除了必须重新定义。 按CtrlS组合键保存代码的修改。再按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 自增长数据标识 Name nvarchar(20) 书名 bookPublish nvarchar(50) 出版社 Price decimal(6,2) 书的价格 为数据库启用缓存通知。打开“开始”|“所有程序”|“Microsoft Visual Studio 2005”|“Visual Studio Tools”|“Visual Studio 2005命名提示”菜单命令。 输入如下命令其中“-ed”和“-et”分别代表启用缓存依赖数据库和启用缓存数据表。 aspnet_regsql.exe -S SqlServer服务器 -E -ed -d 数据库名称 -et -t 表名 注意如果使用的数据库验证方式是“SQL Server身份验证”则需要使用如下的启动命令 aspnet_regsql.exe -S SqlServer服务器 -U Username -P Password -ed -d 数据库名称 -et -t 表名 输入命令后按回车键。如果执行成功效果如图16-7所示。 打开VS2005新建一个网站命名为“SqlCacheDependency”。 按F5键运行程序主要目的是生成一个默认的Web.Config文件。然后关闭运行的程序。 在Web.config中配置数据库连接字符串代码如下 connectionStrings add nameTestCacheConnectionString connectionStringData SourceCGJ-57F90 CCA64C\sqlexpress;Initial CatalogtestCache;Integrated SecurityTrue providerName System. Data.SqlClient/ /connectionStrings 图16-7 启用数据库缓存依赖成功的提示图 在“system.web”节点内添加数据库缓存依赖的配置详细代码如下所示。注意配置中的“connectionStringName”属性要与前面创建的数据库连接字符串的名字相对应。 caching sqlCacheDependency enabled true pollTime 1000 databases add nametestCache connectionStringNameTestCacheConnectionString pollTime 1000 / /databases /sqlCacheDependency /caching 按CtrlS组合键保存配置文件的更改。 打开默认生成的Default.aspx页在设计视图中添加一个GridView控件用来显示从数据库获取的数据。再添加一个Literal控件主要用来显示时间通过时间判断显示的是否是缓存中的数据。 为GridView配置数据源。单击其任务列表在“选择数据源”下拉框中单击“新建数据源”命令打开数据源的配置向导。 在打开的数据源类型窗口中选择“数据库”单击“确定”按钮出现选择连接字符串窗口通过下拉列表选择刚刚创建的“TestCacheConnectionString”连接串。 单击“下一步”按钮出现“配置Select语句”对话框在“列”列表框中选择“*”表示选中所有列。 单击“下一步”按钮出现测试查询对话框然后单击“完成”按钮。 按F7键切换到到代码视图在“Page_Load”事件中添加如下代码主要是显示当前的时间用来判断是否是缓存数据 Literal1.Text DateTime.Now.ToString(); 按CtrlS组合键保存当前页的设计再按F5键运行程序。当刷新页面时可以看到时间是不断变化的这说明数据并没有来自缓存。 打开Default.aspx页在源代码视图的“page ”行下面添加如下所示代码。其中使用的参数“SqlDependency”就是用来添加数据库缓存依赖的。 % OutputCache Duration3600 SqlDependencytestCache:CacheTable VaryByParamnone % 注意Duration参数是表示缓存的过期时间单位是毫秒。 按F5键运行程序此时再刷新页面发现当前的时间已经不再变化因为整个页的数据被缓存了起来。 此时修改数据库的内容然后刷新运行着的页面可以发现数据跟着发生了变化。这就是数据库缓存依赖的体现。当数据库内容更新时不管缓存的时间有没有到缓存的内容都会被更新。 16.5 Session和Cache的区别 以前实现数据的缓存有很多种方法有客户端的Cookie有服务器端的Session和Application。其中Cookie是保存在客户端的一组数据主要用来保存用户名等个人信息。Session则保存对话信息。Application则是保存在整个应用程序范围内的信息相当于全局变量。通常使用最频繁的是Session那么Session和Cache又有什么区别呢 本节结合使用经验详细介绍Session缓存和Cache缓存的区别。 1最大的区别是Cache提供缓存依赖来更新数据而Session只能依靠定义的缓存时间来判断缓存数据是否有效。 2即使应用程序终止只要Cache.Add方法中定义的缓存时间未过期下次开启应用程序时缓存的数据依然存在。而Session缓存只是存在于一次会话中会话结束后数据也就失效了。 3Session容易丢失导致数据的不确定性而Cache不会出现这种情况。 4由于Session是每次会话就被加载所以不适宜存放大量信息否则会导致服务器的性能降低。而Cache则主要用来保存大容量信息如数据库中的多个表。 5VS2005的测试版提供了将缓存保存在硬盘上的参数但正式版中取消了这个功能估计其在以后版本中会重新实现。而Session目前只能保存在内存中对其性能有影响。 为了提高Cache的有效利用率建议对于不经常改动的数据使用Cache。 16.6 小结 本章主要介绍了如何使用System.Web.Caching命名空间下的类主要包括以下三个Cache, CacheDependency和SqlCacheDependency。Cache类主要用来创建缓存项主要针对的是数据不经常改变但又使用频繁的数据表或文件。另两个类是.NET 2.0新添加的缓存依赖服务。通过文件依赖或数据库依赖可以实现缓存数据的及时更新。 通过本章的学习希望可以提高读者编写的网站的数据读取速度节约带宽为Web 2.0时代的到来打下坚实的基础。 出处《C#实用开发参考大全》一书第16章。 参考 http://www.cnblogs.com/codecrazy/archive/2010/10/14/1851936.html 不怕范围太大,大可以写上[^]*)\1\s转载于:https://www.cnblogs.com/mq0036/p/4031223.html