ASP.NET缓存技术 第三讲

应用程序数据缓存

System.Web.Caching 命名空间提供用于缓存服务器上常用数据的类。此命名空间包括 Cache 类,该类是一个字典,您可以在其中存储任意数据对象,如哈希表和数据集。它还为这些对象提供了失效功能,并为您提供了添加和移除这些对象的方法。您还可以添加依赖于其他文件或缓存项的对象,并在从 Cache 对象中移除对象时执行回调以通知应用程序。

 

///<summary>

///获取当前应用程序指定CacheKey的Cache对象值

///</summary>

///<param  name="CacheKey">索引键值</param>

///<returns>返回缓存对象</returns>

publicstatic object GetCache(string  CacheKey)

{

     System.Web.Caching.Cache objCache = HttpRuntime.Cache;

    return objCache[CacheKey];

}

///<summary>

///设置当前应用程序指定CacheKey的Cache对象值

///</summary>

///<param  name="CacheKey">索引键值</param>

///<param  name="objObject">缓存对象</param>

publicstatic void SetCache(string  CacheKey,object objObject)

{

     System.Web.Caching.Cache objCache = HttpRuntime.Cache;

     objCache.Insert(CacheKey, objObject);

}

///<summary>

///设置当前应用程序指定CacheKey的Cache对象值

///</summary>

///<param  name="CacheKey">索引键值</param>

///<param  name="objObject">缓存对象</param>

///<param  name="absoluteExpiration">绝对过期时间</param>

///<param  name="slidingExpiration">最后一次访问所插入对象时与该对象过期时之间的时间间隔</param>

publicstatic void SetCache(string  CacheKey,object objObject,DateTime absoluteExpiration,TimeSpan slidingExpiration)

{

     System.Web.Caching.Cache objCache = HttpRuntime.Cache;

     objCache.Insert(CacheKey, objObject,null,  absoluteExpiration, slidingExpiration);

}       

protectedvoid  Page_Load(object sender,EventArgs e)

{

    string CacheKey ="cachetest";

    object objModel = GetCache(CacheKey);//从缓存中获取

    if (objModel ==null)//缓存里没有

    {

        objModel  = DateTime.Now;//把当前时间进行缓存

        if (objModel !=null)

        {

            int CacheTime = 30;//缓存时间30

             SetCache(CacheKey, objModel,DateTime.Now.AddSeconds(CacheTime), TimeSpan.Zero);//写入缓存

        }

    }

    Label1.Text =  objModel.ToString();

}

 

以上几种方法都很好的解决了数据缓存的问题,但由一个最大的问题是当数据发生变化了,而缓存里还是过期的数据,只有等缓存过期后才会重新获取最新的数据,这样的话,很多时候用户获取的数据都是和实际数据不一致的过期数据。这同样给用户造成了比较大的麻烦,怎么办呢?接着往下看。

 

  文件缓存依赖

这种策略让缓存依赖于一个指定的文件,通过改变文件的更新日期来清除缓存。

                                                

///<summary>

///获取当前应用程序指定CacheKey的Cache对象值

///</summary>

///<param  name="CacheKey">索引键值</param>

///<returns>返回缓存对象</returns>

publicstatic object GetCache(string  CacheKey)

{

     System.Web.Caching.Cache objCache = HttpRuntime.Cache;

    return objCache[CacheKey];

}

///<summary>

///设置以缓存依赖的方式缓存数据

///</summary>

///<param  name="CacheKey">索引键值</param>

///<param  name="objObject">缓存对象</param>

///<param  name="cacheDepen">依赖对象</param>

publicstatic void SetCache(string  CacheKey,object objObject,  System.Web.Caching.CacheDependency dep)

{

     System.Web.Caching.Cache objCache = HttpRuntime.Cache;

     objCache.Insert(

        CacheKey, 

         objObject,

        dep,

         System.Web.Caching.Cache.NoAbsoluteExpiration, //从不过期

         System.Web.Caching.Cache.NoSlidingExpiration, //禁用可调过期

         System.Web.Caching.CacheItemPriority.Default,

        null);

}

protectedvoid  Page_Load(object sender,EventArgs e)

{

    string CacheKey ="cachetest";

    object objModel = GetCache(CacheKey);//从缓存中获取

    if (objModel ==null//缓存里没有

    {

        objModel  = DateTime.Now;//把当前时间进行缓存

        if (objModel !=null)

        {

            //依赖 C:\\test.txt 文件的变化来更新缓存

             System.Web.Caching.CacheDependency  dep =new System.Web.Caching.CacheDependency("C:\\test.txt");

             SetCache(CacheKey, objModel, dep);//写入缓存

        }

    }

 

    Label1.Text =  objModel.ToString();

}

    当我们改变test.txt的内容时,缓存会自动更新。这种方式非常适合读取配置文件的缓存处理。如果配置文件不变化,就一直读取缓存的信息,一旦配置发生变化,自动更新同步缓存的数据。

这种方式的缺点是,如果缓存的数据比较多,相关的依赖文件比较松散,对管理这些依赖文件有一定的麻烦。对于负载均衡环境下,还需要同时更新多台Web服务器下的缓存文件,如果多个Web应用中的缓存依赖于同一个共享的文件,可能会省掉这个麻烦。 

 

数据库缓存依赖

更多的时候,我们的服务器性能损耗还是在查询数据库的时候,所以对数据库的缓存还是显得特别重要,上面几种方式都可以实现部分数据缓存功能。但问题是我们的数据有时候是在变化的,这样用户可能在缓存期间查询的数据就是老的数据,从而导致数据的不一致。那有没有办法做到,数据如果不变化,用户就一直从缓存中取数据,一旦数据变化,系统能自动更新缓存中的数据,从而让用户得到更好的用户体验。

  答案是肯定的!.NET已经为我们提供了这样一种非常好的解决方法:SqlCacheDependency数据库缓存依赖。

  

实现步骤:

   下面就让我们看一下如何实现数据库缓存依赖功能:

第一步: 修改web.config,让项目启用SqlCacheDependency 。

将下列代码加入web.config的<system.web>节:        

<?xmlversion="1.0"?>

<configuration>

     <appSettings/>

     <connectionStrings>

        <addname="strcodematic"connectionString="data source=.;initial catalog=codematic;user  id=sa;password=123456" providerName="System.Data.SqlClient" />

    </connectionStrings>

     <system.web>

         <caching>

           <sqlCacheDependencyenabled="true"pollTime="6000">

               <databases>

                   <addname="codematic"connectionStringName="strcodematic" />

               </databases>

           </sqlCacheDependency>         

         </caching>

     

         <compilationdebug="true">

         </compilation>     

         <authenticationmode="Windows"/>      

     </system.web>

</configuration>

 

 

这里的connectionStringName指定了在<connectionStrings>中添加的某一个连接字符串。name则是为该SqlCacheDependency起的名字,这个名字将在第3步中用到。
SqlCacheDependency类会自动完成对此配置节信息的读取以建立和数据库之间的联系。

 

注意:

<databases>节的<addname="codematic"connectionStringName="strcodematic" />中的name属性值必须和第三步的Page_Load代码中System.Web.Caching.SqlCacheDependency("codematic","P_Product");中的第一个参数(数据库名称)相一致。

 


第二步:执行下述命令,为 数据库启用缓存依赖。

如果要配置SqlCacheDependency,则需要以命令行的方式执行。

aspnet_regsql.exe工具位于Windows\\Microsoft.NET\\Framework\\[版本]文件夹中。

aspnet_regsql -C "datasource=.;initial catalog=BOOKDB;user id=sa;password=123456" -ed -et -t "BookInfo"

参数-C后面的字符串是连接字符串(请替换成自己所需要的值),

参数-t后面的字符串是数据表的名字。

 

 运行结果如图15-3所示:

 

图15-3 启用数据库缓存依赖

 命令执行后,在指定的数据库中会多出一个AspNet_SqlCacheTablesForChangeNotification表。


注意:

要使得7.0或者2000版本以上的SQLServer支持SqlCacheDependency特性,需要对数据库服务器执行相关的配置。

有两种方法配置SQLServer:

一 使用aspnet_regsql命令行工具,

二 使用SqlCacheDependencyAdmin类。

 

例如:

aspnet_regsql  -S "server" -E -d "database" –ed  或者

aspnet_regsql  -S "server" -E -d "database" -et -t "table"
  如果是Sql验证的话要把-E换成,-U (用户名),-P (密码)

 

以下是该工具的命令参数说明

-? 显示该工具的帮助功能;

-S 后接的参数为数据库服务器的名称或者IP地址;

-U 后接的参数为数据库的登陆用户名;

-P 后接的参数为数据库的登陆密码;

-E 使用当前登录用户的 Windows 集成认证进行身份验证。

-d 后接参数为对哪一个数据库采用SqlCacheDependency功能;

-C 连接数据库的连接字符串。如果您指定服务器(-S)和登录(-U和-P,或 -E)信息,则此选项不是必需的,因为连接字符串已经包含这些信息。

-t 后接参数为对哪一个表采用SqlCacheDependency功能;

-ed 允许对数据库使用SqlCacheDependency功能;

-dd 禁止对数据库采用SqlCacheDependency功能;

-et 允许对数据表采用SqlCacheDependency功能;

-dt 禁止对数据表采用SqlCacheDependency功能;

-lt 列出当前数据库中有哪些表已经采用sqlcachedependency功能。

 


第三步:在代码中使用缓存,并为其设置SqlCacheDependency依赖:

   

///<summary>

///获取当前应用程序指定CacheKey的Cache对象值

///</summary>

///<param  name="CacheKey">索引键值</param>

///<returns>返回缓存对象</returns>

publicstatic object GetCache(string  CacheKey)

{

     System.Web.Caching.Cache objCache = HttpRuntime.Cache;

    return objCache[CacheKey];

}

///<summary>

///设置以缓存依赖的方式缓存数据

///</summary>

///<param  name="CacheKey">索引键值</param>

///<param  name="objObject">缓存对象</param>

///<param  name="cacheDepen">依赖对象</param>

publicstatic void SetCache(string  CacheKey,object objObject,  System.Web.Caching.CacheDependency dep)

{

     System.Web.Caching.Cache objCache = HttpRuntime.Cache;

     objCache.Insert(

        CacheKey,

         objObject,

        dep,

         System.Web.Caching.Cache.NoAbsoluteExpiration,//从不过期

         System.Web.Caching.Cache.NoSlidingExpiration,//禁用可调过期

         System.Web.Caching.CacheItemPriority.Default,

        null);

}

protectedvoid  Page_Load(object sender,EventArgs e)

{

    string CacheKey ="cachetest";

    object objModel = GetCache(CacheKey);//从缓存中获取

    if (objModel ==null)//缓存里没有

    {

        objModel  = GetData();//把当前时间进行缓存

        if (objModel !=null)

        {

            //依赖数据库codematic中的P_Product表变化  来更新缓存

            System.Web.Caching.SqlCacheDependency  dep =new System.Web.Caching.SqlCacheDependency("codematic""P_Product");

             SetCache(CacheKey, objModel, dep);//写入缓存

        }

    }

               

     GridView1.DataSource = (DataSet)objModel;

     GridView1.DataBind();

}

 

//查询数据

privateDataSet  GetData()

{

    string conString ="data  source=127.0.0.1;initial catalog=codematic;user id=sa;password=";

    string strSQL ="SELECT  * FROM P_Product";

    SqlConnection myConnection =newSqlConnection(conString);

    DataSet ds =new DataSet();

     myConnection.Open();

    SqlDataAdapter adapter =newSqlDataAdapter(strSQL,  myConnection);

     adapter.Fill(ds, "Product");

     myConnection.Close();

    return ds;

}

 

 

   从以上代码可以看出,和文件依赖基本相同,只是在存放缓存SetCache时存入的依赖对象不同罢了。这里用的是SqlCacheDependency

     其中,创建SqlCacheDependency的构造方法:

public  SqlCacheDependency (string databaseEntryName,string tableName)

 

l  databaseEntryName:是在Web.config 文件的 caching 节的 sqlCacheDependency 的 databases 元素中定义的数据库的名称。

l  tableName :与 SqlCacheDependency 关联的数据库表的名称。

   这样,只有当P_Product表的内容发生变化时,查询操作才会重新查询数据更新缓存的内容,可以大大减少数据库的重复查询和提高系统的性能和运行效率。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值