缓存分为页面缓存,数据缓存,数据源缓存,页面缓存主要指的是webform页面中的outputcache标记以及他所带的一些属性,通过设置实现页面信息的缓存,数据源缓存类似于dataset这样的数据集以及微软封装好的那些缓存的插件可以实现,数据源缓存是对cache这个类进行的一些操作,这样的方式较为灵活,可以实现局部数据的缓存
缓存是存储于服务器上的可以供任何人访问的信息,这一点和cookie不同,cookie只能存在于个人客户端。
缓存分为普通缓存,文件缓存依赖和数据库缓存依赖。
普通缓存如:cache["xxx"]=“这里面装有缓存信息”
如果更深一步,可以使用
cache.add(
string key, Object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback
)
参数意义如下:
public void Remark(string key, object value, CacheItemRemovedReason reason) { StreamWriter sw = new StreamWriter(@"C:\Users\Hero\Desktop\log.txt"); sw.Write("名称为:"+key+",值为"+value+"的缓存已经被删除,删除原因是:"+reason.ToString()+",删除时间:"+DateTime.Now); sw.Close(); }
////所依赖的TXT文件 //StreamWriter sw = new StreamWriter(@"C:\Users\Hero\Desktop\test.txt"); //sw.WriteLine("孤独之旅"); //sw.Close(); ////文件依赖 //CacheDependency cd = new CacheDependency(@"C:\Users\Hero\Desktop\test.txt"); //Cache.Add("xx", this.TextBox1.Text, cd, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Normal, Remark);
当指定的文件发生改变的时候就会删除存在的关联缓存。
数据库缓存:
这个比较难设置,分步骤如下:
1、创建一个触发器和一个标记表,如果希望做缓存的目标表数据有变化的时候可以丢标记表进行修改此时触发缓存事件例如:
IF EXISTS( SELECT * FROM sys.triggers WHERE name = ‘tr_Action‘) DROP TRIGGER tr_Action GO CREATE TRIGGER tr_Action ON Student FOR insert,update,delete as update dbo.CacheDep set tVersion=tVersion+1 GO
当学生表进行修改的时候触发标记表
2、配置文件进行配置,格式如下:
<configuration> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> <!--配置数据库缓存的配置节点 --> <caching> <sqlCacheDependency enabled="true" > <databases> <!--pollTime:每过多少毫秒查询一次数据库是否产生变化 name:数据库的名字 connectionStringName:连接字符串的名字 --> <add name="DESKTOP-R9KM69D" connectionStringName="deFaultConn" pollTime="1000"/> </databases> </sqlCacheDependency> </caching> </system.web> <connectionStrings> <add name="deFaultConn" connectionString="Data Source=DESKTOP-R9KM69D;Initial Catalog=Test;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework"/> </connectionStrings> </configuration>
缓存的配置全部写到了<caching>标签内部
3、操作dos运行aspnet_regsql.dll,命令格式如下:
aspnet_regsql -C "Data Source=DESKTOP-R9KM69D;Initial Catalog=Test;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework" -ed -et -t "CacheDep"
其中
-t "CacheDep"指的是缓存依赖的表
-C "Data Source=DESKTOP-R9KM69D;Initial Catalog=Test;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework"
是数据库连接字符串
4、编写程序,语法如下:
//参数1:数据库名称,参数二:表名称,表数据变化的时候缓存也会变化 SqlCacheDependency scd = new SqlCacheDependency("DESKTOP-R9KM69D", "CacheDep"); Cache.Add("xd", this.TextBox1.Text==null?"空的":this.TextBox1.Text, scd, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Normal, Remark);
一般程序都是先读取缓存看看是否存在,如果不存在,就重新读取数据源并且存入缓存,方便下次使用
原文:http://www.cnblogs.com/llcdbk/p/5503471.html