asp.net2.0缓存

2008年01月10日 星期四 下午 05:38

这部分的东西还真的是不好整得,我学得很普通,很多东西都还不会,更多的内容可以去网上去查找,这里记下我的一些总结。

缓存有几种,第一种是数据缓存,这是最简单的,用法就和Session差不多,相当地简单,它可以添加,付值和插入,可以把它理解为一个哈希表的样子,它里面的值是一个KEY对应一个VALUE,添加的时候有几个参数要注意一下,如:

TimeSpan SessTimeout = new TimeSpan(0, 0, Session.Timeout, 0, 0);

        Cache.Add("user", Session["user"], null, DateTime.MaxValue, SessTimeout, CacheItemPriority.NotRemovable, null);

当然这里的SessTimeOut是可以随便设定的,中间有一个参数,我这里设的是NULL,是因为没有和其它文件产生依赖关系,Cache.Insert就相对要方便得多了,它有几个方法重载,

取也是相当方便Cache.Get("user")就取到了,如果有这个缓存的话。

不过我还没发现它和Session配合使用的好处在那里,应该说是应用在那里。

另一种是页面缓存,可能也是用得最多的。

页缓存是指使用页缓存后,用户第一次访问这个页面的时候,会在内存中把页数据存起来,在一定时间内,当用户重新访问这个页面的时候,不会发送请求到服务器端,而直接在内存中取出来,原理就是这样了。看到这里,可能很多人会想到会很难,很复杂,其实不是的,.net为我们提供了很方便的使用。

只要在页头加一行代码就行了,如:

<%@ OutputCache Duration="10" VaryByParam="none" %>
这里的Duration表示缓存时间,单位是秒,VaryByParam是表示说按指定的参数缓存数据,一般如果没特别的情况,多半可以设为none.

到页面上拖放 <div>
        <asp:Label ID="lbTime" runat="server"></asp:Label>
    </div

在Page_Load中写lbTime.Text = DateTime.Now.ToString();然后运行,可以发现,在10秒内,页面的时间是不变的。

还有一种情况,<%@ OutputCache Duration="10" VaryByParam="none" %>它表示整个页面在一定时间内都会被缓存,但是,如果页面上有80%很少变化,而有20%的数据在变化,也就是说,有少量部分的数据不能缓存的,看下面的示例,

还是刚那个页面,加一个控件:<div>
        <asp:PlaceHolder ID="holder" runat="server"></asp:PlaceHolder>
    </div>

Page_Load中增加几行代码:

Substitution sub = new Substitution();
        sub.MethodName = "GetNowTime";

        holder.Controls.Add(sub);

Substitution 是2.0专为缓存定义的一个控件,可以看到,这里只设了MethodName 这个属性,它表示在刷新页面的时候,这个控件回调的方法,方法内容如下:

private static string GetNowTime(HttpContext c)
    {
        return DateTime.Now.ToString();
    }

这里要注意三点:1)静态方法;2)返回值为String;3)传入值为HttpContext ,也就是说方法的签名一定要这样。

再运行页面,并刷新,会发现,holder中的内容是被刷新了的,而lbTime中的数据是被缓存起来了。

关于这里页头的VaryByControl我还没理解到它,做了两个示例,但出现了问题,还没时间解决,

以上这些可以看出,在页面上定义一个时间,那么,在这个时间内,当用户返回来这个页面时,看到的数据就是用户自身内存中缓存的数据了,也就是说页面不再是点击一下BUTTON就返回服务器了,而是每间隔多少时间才返回一次服务器,这样就会产生一个缺陷,如果在这个时间内,有其它用户更改了数据,那么,当前用户看到的数据将是假的数据了,这会造成信息的不同步,怎么办呢?

缓存还提供了另一个方式,SQL缓存,它比上面讲的优点在于:当数据库的表的数据发生变化时,设了SQL缓存的话,SQL会监视这个表的数据,一旦数据发生变化,那么如果此时有页面返回服务端请求,就不会在用内存中的数据了,而是返回到服务器,取真实数据。页面要加一个东西,

<%@ OutputCache Duration="10" SqlDependency="YPX:Employee" VaryByParam="none" %>

可以看到SqlDependency是新加的,它的语法为:数据库:表,意思是当前这页面要求数据库监视那个库的那个表,这里之后还没有完,还要配置一下数据库,2.0自带了一个工具:aspnet_regsql.exe,可以在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727找到它,第一次运行会显示成CMD的形式,但是以后运行的话,就会弹出一个信息框,那里不知道怎么设,如果是第二次的话,只有在CMD里面运行它了,这里要说一下它的使用,关于它的参数,太多了,网上可以找到,我这里只写一下我用的方式:

aspnet_regsql.exe -S <Server> -U <Username> -P <Password> -ed -d Northwind -et -t Employees

-S参数表示服务器,-U表示用户名,-P表示密码,-D表示数据库,-T表示表,把相应的参数写好,运行就可以了,这样再自己做一下示例吧,很好用的,不过这里要提醒一下,不要使用太多的SQL缓存,因为这样会加重数据库的负担,数据会用大量的资源来监视。这样的话,还不如不用缓存,是吧,官方推荐的是:建议使用两个表监视就可以了,但也可能可以使用更多,还有待理解。

posted @ 2008-02-01 10:58  point.deng  阅读(210)  评论(0编辑  收藏  举报