[转]C#基础回顾:Asp.net 缓存

正文转自http://www.cnblogs.com/stg609/archive/2009/03/22/1418992.html

 缓存的意向
     
你进电脑的下,是否会面以意CPU的二级缓存?是无是梦想二级缓存能够大点?那你有没来纪念了您干什么会发这种想法?说到底,就是为性问题,如果缓存大点,那便表示我们处理数量的响应速度会又快。这就是吓于我们查阅字典,如果生一个单词,你用知道它的意思,你是休是索要查阅字典,查找目录,翻至指定的页,找到您只要之单词,这才能够得该词的分解?可是不幸之是,你连从未感念使去记住是词,当次不善相遇这个词的时,你是免是又得重复同一整整上述的动作?如果您立即记忆犹新这单词,那是未是及时便能知道者词的意思了?这是休是老高效?
      缓存的毛病      
如果叫您于一个音讯无法转达的地方(比如原始森林)呆上几个月,而就几乎单月吃,发生了众多扭转,其中某就是是若上次查询的生单词由于某些特殊之原故,它的说给换了。而你明显不亮堂之业务,如果手上,让你讲是单词,你是不是会见生出笑话?这是啊由呢?很简短,因为若的脑海里只有保留在上次的说,而从未立即得到更新。

      入正题(本人从来不深入钻研,如有不足之处,希望大家不吝赐教)

      示例1:      
你期望不期望您的动态网站也有一个得记忆之大脑?可能某些朋友见面以为可笑,“这来必不可少也?”
。如果您的网站牵涉到大方的多寡交互,而这些多少给更新的频率又不是非常高,比如小提供新闻资讯的站点,可能就是光需要在上午9:00面前对情报拓展创新,而后就不需要再次变更了。那也就是说9点后用户访问所获的多寡还是同等的。但是,因为无提供缓存的力量,用户之历次看,仍旧会造成服务器端对数据库的拜会,这会无会见怪影响性?
      在Asp.net
webform中可由此配备页面指令OutputCache来实现力量。在公的aspx文件之满头在如下的语:

<%@ OutputCache Duration=”10″ VaryByParam=”none”%>

      上述重点出星星点点独特性(要配备缓存至少得这点儿个特性):
     
Duration用来定义页面被缓存的辰(单位为秒),也就是说在10秒内,重复访是页面将收获完全一致的数目。
     
VaryByParam表示是否以接受请求的参数(xxx.aspx?id=1)而更改,如果设置为none,表示不改。
      这样,一个极端简易的休养生息存效果就算好兑现了。

      **示例2:
**     
通过者的事例,相信你就掌握到了缓存的魅力。但是,上面的效果无法根据页面的参数进行缓存,也就是说不管我传什么参数为页面,显示的且是一样的。比如我以10秒内先后访问xxx.aspx?id=1与xxx.aspx?id=2,其出示的效用是同等的。如果指望根据参数进行缓存,只要给VaryByParam=”id”就得了(大小写无关)。这样就会见因id的价不同而个别缓存,相当给缓存了页的几近个不等的版本。

      示例3:      
如果用一些未为缓存,可以用服务器端控件Substitution。操作十分简单,只待用欠控件拖动到页面上,然后设置一下里面的MethodName属性就好了。
     
该控件编译成Html后,不带来其他标志,就不啻是一个占用位符。其中显示的凡情是出于MethodName所指定的方法。但是该方法发生自然之限量:
      1:静态方法。
      2:只接受HttpContext 类型的参数。
      3:必须返回 string 类型的值。
      如:

public static string GetCurrentTime(HttpContext context)
{
    return DateTime.Now.ToString();
}

      这样,每次页面刷新后就得取当前底流年,而别数据则是被缓存的。

      示例4:      
是匪是认为通过这种办法落实的组成部分缓存、部分刷新的职能来广大受制。如果用同种植更灵活的主意来促成有缓存的功效,可以通过用户控件来实现。就是说,我们将待让缓存的数额单独放在一个页面被,然后以拖欠页面及仍我们眼前几独例所介绍的计开展设置。最后把装好的用户控件拖动到最后之页面及就好了。另外,OutputCache指令中还有一个Shared属性,设置该属性也true就表示共享该控件的输出缓存。

<%@ OutputCache Duration=”10″ VaryByParam=”CategoryiD” Shared=”true”%>

 

      示例5:
     
ASP.NET还提供了同等种更便于之方,可以本着页面的变量进行缓存。即以Cache对象。一般用来缓存数据变量,如DataSet。但是,如果数据量比较坏之口舌,建议以及硬盘缓存结合起来用。一般下Cache对象来保存数据库数据好较用OutputCache配置性能更好。但是最不要因此Cache来存放用户的登陆信息等等,因为缓存中之多寡随时都生或受替换出内存(如果您掌握有关于电脑组成方面的原理,可能会见又好理解)。

SQL Server 1
//从Cache对象中赢得相应的dataset
DataSet ds = (DataSet)Cache[“data”];

//判断dataset是否也空,如果也空,说明没有当缓存中。
if (ds == null)
{
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[“NorthwindConnectionString”].ConnectionString);
    conn.Open();
    SqlCommand cmd = new SqlCommand(“select * from products where CategoryID = 1”, conn);
    SqlDataAdapter sda = new SqlDataAdapter(cmd);
    ds = new DataSet();
    sda.Fill(ds);
    Cache[“data”] = ds;//将dataset插入到Cache对象中
}

GridView1.DataSource = ds;
GridView1.DataBind();

      示例6:
     
但是地方方式究竟起硌不足,如果当数变动之早晚就是自动更新缓存,那不是还好。这可发有限栽实现方式,通知和轮询。但是MSDN上介绍“通知”的功能只有当Microsoft
SQL Server 2005 的圆版本,即非速成 (non-Express)
版中才来供。而另版本则只是提供了轮询方式,况且自为止见面轮询方式,所以就算来概括介绍下该措施吧。

     
要使用轮询方式,需配备数据库,配置的严重性任务便是当数据库被建立平等张表和组成部分触发器,在这表中存放的凡咱需要轮询的数库表对象及其有关消息,触发器自然是用来当所监视的阐发发生变化的时实施了。幸好,这等同层层操作我们无非待用几词简单的吩咐就可缓解了。否则的话,我说不定就是见面中断了。
      打开Vsiual studio的指令提示窗口,输入:
      aspnet_regsql.exe -S <Server> -U <Username> -P
<Password> -ed -d <Database> -et -t <TableName>
      如:aspnet_regsql.exe -S .\msserver -U sa -P sa -ed -d Northwind
-et -t products
      如果运行成功,会唤醒:

呢 SQL 缓存依赖项启用该数据库。
.
已完成。
啊 SQL 缓存依赖项启用该表。

     
然后,设置与SqlDependency相关的片音(如,轮询时间),这些信息以web.config中展开设置:

SQL Server 2
<caching>
  <sqlCacheDependency enabled = “true” pollTime = “1000” >
    <databases>
      <add name=”Northwind” 
         connectionStringName=”NorthwindConnectionString”
         pollTime = “1000” />
    </databases>
  </sqlCacheDependency>
</caching>

     
其中的name只要求凡一个有益于记忆的名字(一般就记作数据库的名),pollTime即凡轮询时间(单位:毫秒)。
      [援MSDN中之同段子话:小的 pollTime
值虽然要对数据库的乞求次数增加,但能再次快的拿过时数据由缓存中革除。较生的
pollTime
值虽然减少了对数据库的求次数,但多了于后台数据变动到破相关缓存条目中的延迟时间。还好,数据库请求单是执行一个简练的贮存过程,该存储过程只是从一个简单易行的笔录数少之表返回不多的几乎履。对您的应用程序试用一些两样的
pollTime
值,从中寻找有一个不过抵数据库访问和数据过时这两头的理想值。允许的极度小
pollTime 值为 500 。]
    
 connectionStringName即凡<connectionStrings>节被所安排的数据库连接名称。如:

SQL Server 3
 <connectionStrings>
  <add name=”NorthwindConnectionString” connectionString=”Data Source=1AC425E4D0B74F1\msserver;Initial Catalog=Northwind;Integrated Security=True”
   providerName=”System.Data.SqlClient” />
 </connectionStrings>

      最后修改OutputCache指令中之Duration为”999999″用来表示最好,再投入一个属性SqlDependency,设置该属的价也”database,tableName”。其中database为Web.config
中 <add> 元素的name
属性中指定的数据库名。以Northwind的products表也条例就应该做:SqlDependency=”Northwind:products”。如果产生一定量摆表就做:database:tableName;database2:tableName2。

      如果尽安排了,就可以看效果了。你见面发觉只有当数码给更新的当儿,才见面更新缓存。这个功能显著比前几种植艺术来得重好,但是也未克对接的施用这种艺术,毕竟轮询还是会负出一些代价的。
     
[横流,上述配置过程被所关联到之有数据库名称、表名称,大小写一定要是前后一致,否则可能会见编译失败。]

      示范打包下载 

      参考:
      1.苏鹏先生讲的“asp.net2.0缓存与性”
      2.vs2005入门 之 Substitution
[视频]
      3.Asp.net
缓存技术总结
      4.将 ASP.NET 输出缓存与 SQL Server
结合使用.aspx)
      5.利用 SQL
缓存依赖项

作者:stg609

正文版权归作者和博客园共有,欢迎转载,但未经作者同意要保留这个段子声明,且在篇章页面明显位置为有原文连接,否则保留追究法律责任的权。

自家博客已经换到Charley Blog

相关文章