缓存总结

 缓存分为页面缓存,数据缓存,数据源缓存,页面缓存主要指的是webform页面中的outputcache标记以及他所带的一些属性,通过设置实现页面信息的缓存,数据源缓存类似于dataset这样的数据集以及微软封装好的那些缓存的插件可以实现,数据源缓存是对cache这个类进行的一些操作,这样的方式较为灵活,可以实现局部数据的缓存

缓存是存储于服务器上的可以供任何人访问的信息,这一点和cookie不同,cookie只能存在于个人客户端。

缓存分为普通缓存,文件缓存依赖和数据库缓存依赖。

普通缓存如:cache["xxx"]=“这里面装有缓存信息”

如果更深一步,可以使用

cache.add(

string key,
	Object value,
	CacheDependency dependencies,
	DateTime absoluteExpiration,
	TimeSpan slidingExpiration,
	CacheItemPriority priority,
	CacheItemRemovedCallback onRemoveCallback

)

参数意义如下:

key
类型:System.String
用于引用该项的缓存键。
value
类型:System.Object
要添加到缓存的项。
dependencies
类型:System.Web.Caching.CacheDependency
该项的文件依赖项或缓存键依赖项。 当任何依赖项更改时,该对象即无效,并从缓存中移除。 如果没有依赖项,则此参数包含 null。 
absoluteExpiration
类型:System.DateTime
所添加对象将到期并被从缓存中移除的时间。 如果使用可调到期,则 absoluteExpiration 参数必须为 NoAbsoluteExpiration。 
slidingExpiration
类型:System.TimeSpan
最后一次访问所添加对象时与该对象到期时之间的时间间隔。 如果该值等效于 20 分钟,则对象在最后一次被访问 20 分钟之后将到期并从缓存中移除。 如果使用绝对到期,则 slidingExpiration 参数必须为 NoSlidingExpiration。 
priority
类型:System.Web.Caching.CacheItemPriority
对象的相对成本,由 CacheItemPriority 枚举表示。 缓存在退出对象时使用该值;具有较低成本的对象在具有较高成本的对象之前被从缓存移除。 
onRemoveCallback
类型:System.Web.Caching.CacheItemRemovedCallback
在从缓存中移除对象时所调用的委托(如果提供)。 当从缓存中删除应用程序的对象时,可使用它来通知应用程序。 

返回值

类型:System.Object
如果添加的项之前存储在缓存中,则为表示该项的对象;否则为 null
 
最后一个回调函数如果是缓存修改应用对象的时候可以使用cache。insert方法去调用。
一般回调函数是用于记录缓存的变化信息,如:
        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();
        }
这样的日志记录。
 
 
滑动时间设置就是说最后一次操作起过了指定时间未执行操作就会删除缓存
 
关于缓存依赖使用到的类是
CacheDependency(文件缓存)和SqlCacheDependency(数据库缓存)
代码如下:
文件缓存:
            ////所依赖的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);

 

一般程序都是先读取缓存看看是否存在,如果不存在,就重新读取数据源并且存入缓存,方便下次使用 

 

posted @ 2016-05-17 22:32  洛晨随风  阅读(214)  评论(0编辑  收藏  举报