[转]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来存放在用户之登陆音讯等等,因为缓存中的数量随时都爆发或给互换出内存(固然你左右一些有关电脑组成方面的规律,可能会合重好明)。

图片 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中举行设置:

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

     
其中的name只要求是一个好记念之名(一般就是记作数据库的称),poll提姆(Tim)e即凡轮询时间(单位:毫秒)。
      [援MSDN中之一模一样段落话:小的 poll提姆(Tim)e
值即便要对数据库的请次数扩展,但可以再快的以过时数据由缓存中祛。较生的
poll提姆(Tim)e
值即便缩小了对数据库的呼吁次数,但净增了从后台数据变动到破相关缓存条目中的延迟时间。还好,数据库请求单是行一个简短的蕴藏过程,该存储过程只是于一个简便的记录数少之表再次回到不多之几尽。对而的应用程序试用一些两样之
poll提姆e
值,从中寻找来一个可是平衡数据库访问与数量过时这两边的理想值。允许的最好小
poll提姆(Tim)e 值为 500 。]
    
 connectionStringName即凡<connectionStrings>节中所安排的数据库连接名称。如:

图片 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

相关文章