菜单

注册免费送38元体验金基础回顾

2018年12月30日 - 注册免费送38元体验金

本文转自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来存放用户的登陆音讯等等,因为缓存中的数据随时都有可能被轮换出内存(即便您领悟一些有关电脑组成方面的原理,可能会更好精晓)。

注册免费送38元体验金 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();
注册免费送38元体验金,    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中举办设置:

注册免费送38元体验金 2
<caching>
  <sqlCacheDependency enabled = “true” pollTime = “1000” >
    <databases>
      <add name=”Northwind” 
         connectionStringName=”NorthwindConnectionString”
         pollTime = “1000” />
    </databases>
  </sqlCacheDependency>
</caching>

     
其中的name只要求是一个利于记念的名字(一般就记作数据库的名目),poll提姆e即是轮询时间(单位:飞秒)。
      [引用MSDN中的一段话:小的 poll提姆(Tim)e
值固然使对数据库的哀求次数增多,但能更快的将过时数据从缓存中清除。较大的
poll提姆e
值即便缩短了对数据库的呼吁次数,但净增了从后台数据变动到清除相关缓存条目之间的延迟时间。还好,数据库请求只是执行一个简约的积存过程,该存储过程只是从一个简短的笔录数少的表重返不多的几行。对您的应用程序试用一些见仁见智的
poll提姆e
值,从中找出一个可平衡数据库访问和数量过时这二者的理想值。允许的小不点儿
poll提姆e 值为 500 。]
    
 connectionStringName即是<connectionStrings>节中所配置的数据库连接名称。如:

注册免费送38元体验金 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
属性中指定的数据库名。以诺思(North)wind的products表为例就应该创作:SqlDependency=”诺思wind: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

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图