ASP.Net性能优化——页面数据缓存
1 基本概念
ASP.NET提供了一个相当出色的缓存引擎机制,它允许页面保存和索引HTTP请求所要求的各种各样的对象。ASP.NET的缓存对各个应用来说是私有的,是存储各种对象的存储器。缓存的生存周期取决于应用的生存周期,也就是说,当应用重新启动时,缓存实际上也已重建。
缓存提供了一个简单的字典接口,以便于开发者能够轻而易举放置对象到缓存中,并在以后使用。最简单的情况下,放置一个对象到缓存中,就如同对字典增加一个条目。
例如:
asp.net提供了三种缓存替换的策略:
(1)“腐烂搜索”(Scavenging)
比较类似于“最近最少使用”替换原则,当内存变得比教紧张时,缓存机制会找出最不常用和最不重要的对象,把它从内存中移出,以减轻系统压力。为控制“腐烂搜索”的具体行为,编程者必须在插入缓存对象时,指明插入它的耗费和多少时间内它必须被存取一次才能继续留在缓存中,以供替换时进行决择。
(2)“到期控制”(Expiration)
编程者可以指定缓存对象的生存周期,这种指定的时间可以是绝对的也可以是相对的。例如绝对的时间(下午6:00到期),相对时间(该对象距最近一次存取它的时间满10分钟即到期)。当一个缓存对象到期后,它将从缓冲内存中移出,此时对该对象的索引将得到null值,除非又重新插入该对象。
(3)“文件和键值依赖”
从外部文件或者是其他缓存键值是否改变,来决定本身键值是否有效。如果依赖发生改变,缓存对象将变得不可使用,并从缓存中移动出来。试想这样一种情况,应用从一个XML文件中读出金融信息,而该文件又被定期地修改。应用的作用是利用从该文件读出的信息构造一个图形对象以表示销售的情况。当应用读入文件时,它把数据插入缓存中,并记录下文件的依赖关系。当文件发生修改时,应用使开始产生的缓存对象无效并从内存中移出已经无用的数据,此后应用重新读入文件的数据,再把更新后的数据放入缓存,这样就完成了信息的更新,并返回给最终用户。
2 实例
例子:
从一个XML中读出用户信息并显示在页面上,页面提供了两个按钮,一个为增加用户,一个为刷新。我们在内存中建立了一个缓存对象“DataCache5”,它与客户信息文件”custom1.xml”建立了依赖关系。当custom1.xml文件未发生变化时,我们按下“刷新”按钮,可以看到信息是从缓存中读出的;当我们输入客户相应的资料,增加了一个客户以后,再按下“刷新“按钮后,我们可以看到客户信息变成了从文件读出。
(1)ASPX源程序:
ASP.NET提供了一个相当出色的缓存引擎机制,它允许页面保存和索引HTTP请求所要求的各种各样的对象。ASP.NET的缓存对各个应用来说是私有的,是存储各种对象的存储器。缓存的生存周期取决于应用的生存周期,也就是说,当应用重新启动时,缓存实际上也已重建。
缓存提供了一个简单的字典接口,以便于开发者能够轻而易举放置对象到缓存中,并在以后使用。最简单的情况下,放置一个对象到缓存中,就如同对字典增加一个条目。
例如:
1Cache(“myKey”)=MyValue
2即是把MyValue放入缓存中一个叫myKey的缓存对象中,当需要引用myKey值时,可以采用下面的使用方式:
3myValue1=Cache(“myKey”)
4if myValue1 <> Null then
5'非空时的动作
6…
7end if
2即是把MyValue放入缓存中一个叫myKey的缓存对象中,当需要引用myKey值时,可以采用下面的使用方式:
3myValue1=Cache(“myKey”)
4if myValue1 <> Null then
5'非空时的动作
6…
7end if
asp.net提供了三种缓存替换的策略:
(1)“腐烂搜索”(Scavenging)
比较类似于“最近最少使用”替换原则,当内存变得比教紧张时,缓存机制会找出最不常用和最不重要的对象,把它从内存中移出,以减轻系统压力。为控制“腐烂搜索”的具体行为,编程者必须在插入缓存对象时,指明插入它的耗费和多少时间内它必须被存取一次才能继续留在缓存中,以供替换时进行决择。
(2)“到期控制”(Expiration)
编程者可以指定缓存对象的生存周期,这种指定的时间可以是绝对的也可以是相对的。例如绝对的时间(下午6:00到期),相对时间(该对象距最近一次存取它的时间满10分钟即到期)。当一个缓存对象到期后,它将从缓冲内存中移出,此时对该对象的索引将得到null值,除非又重新插入该对象。
(3)“文件和键值依赖”
从外部文件或者是其他缓存键值是否改变,来决定本身键值是否有效。如果依赖发生改变,缓存对象将变得不可使用,并从缓存中移动出来。试想这样一种情况,应用从一个XML文件中读出金融信息,而该文件又被定期地修改。应用的作用是利用从该文件读出的信息构造一个图形对象以表示销售的情况。当应用读入文件时,它把数据插入缓存中,并记录下文件的依赖关系。当文件发生修改时,应用使开始产生的缓存对象无效并从内存中移出已经无用的数据,此后应用重新读入文件的数据,再把更新后的数据放入缓存,这样就完成了信息的更新,并返回给最终用户。
2 实例
例子:
从一个XML中读出用户信息并显示在页面上,页面提供了两个按钮,一个为增加用户,一个为刷新。我们在内存中建立了一个缓存对象“DataCache5”,它与客户信息文件”custom1.xml”建立了依赖关系。当custom1.xml文件未发生变化时,我们按下“刷新”按钮,可以看到信息是从缓存中读出的;当我们输入客户相应的资料,增加了一个客户以后,再按下“刷新“按钮后,我们可以看到客户信息变成了从文件读出。
(1)ASPX源程序:
1<html>
2<head>
3<title>
4数据缓冲实验
5</title>
6</head>
7<body>
8<center>
9<form runat=server>
10<h2>XML文件缓存测试</h2>
11<ASP:DataGrid id="DataGrid1" runat="server"
12 Width="600"
13 BorderColor="black"
14 ShowFooter="false"
15 CellPadding=3
16 CellSpacing="0"
17 Font-Name="Verdana"
18 Font-Size="8pt"
19 />
20<hr>
21<h3>添加一个客户信息</h3>
22<table>
23<tr>
24<td>姓 名:</td>
25<td><ASP:textbox id=txtName runat=server /></td>
26<td><ASP:RequiredFieldValidator ControlToValidate="txtName" Display="static" ErrorMessage="*" runat=server /> </td>
27</tr>
28<tr>
29<td>身份证号:</td>
30<td><ASP:textbox id=txtIdno runat=server /></td>
31<td><ASP:RequiredFieldValidator ControlToValidate="txtIdno"
32Display="static" ErrorMessage="*" runat=server /> </td>
33</tr>
34<tr>
35<td>信用卡号:</td>
36<td><ASP:textbox id=txtCard runat=server /></td>
37<td><ASP:RequiredFieldValidator ControlToValidate="txtCard"
38Display="static" ErrorMessage="*" runat=server /> </td>
39</tr>
40</table>
41<p>
42<asp:button text="增加" onclick="AddBtn_Click" runat=server />
43<asp:button text="刷新" onclick="RefreshBtn_Click" runat=server />
44<p><p><p>
45<asp:label id=lblMsg runat=server />
46</form>
47</center>
48</body>
49</html>
2<head>
3<title>
4数据缓冲实验
5</title>
6</head>
7<body>
8<center>
9<form runat=server>
10<h2>XML文件缓存测试</h2>
11<ASP:DataGrid id="DataGrid1" runat="server"
12 Width="600"
13 BorderColor="black"
14 ShowFooter="false"
15 CellPadding=3
16 CellSpacing="0"
17 Font-Name="Verdana"
18 Font-Size="8pt"
19 />
20<hr>
21<h3>添加一个客户信息</h3>
22<table>
23<tr>
24<td>姓 名:</td>
25<td><ASP:textbox id=txtName runat=server /></td>
26<td><ASP:RequiredFieldValidator ControlToValidate="txtName" Display="static" ErrorMessage="*" runat=server /> </td>
27</tr>
28<tr>
29<td>身份证号:</td>
30<td><ASP:textbox id=txtIdno runat=server /></td>
31<td><ASP:RequiredFieldValidator ControlToValidate="txtIdno"
32Display="static" ErrorMessage="*" runat=server /> </td>
33</tr>
34<tr>
35<td>信用卡号:</td>
36<td><ASP:textbox id=txtCard runat=server /></td>
37<td><ASP:RequiredFieldValidator ControlToValidate="txtCard"
38Display="static" ErrorMessage="*" runat=server /> </td>
39</tr>
40</table>
41<p>
42<asp:button text="增加" onclick="AddBtn_Click" runat=server />
43<asp:button text="刷新" onclick="RefreshBtn_Click" runat=server />
44<p><p><p>
45<asp:label id=lblMsg runat=server />
46</form>
47</center>
48</body>
49</html>
1sub LoadData1
2'当缓存对象DataCache5有效时,从缓存中读出客户信息;无效时,从文件读出信息
3dim dv1 as DataView
4 dv1=Cache("DataCache5")
5 if dv1 = Nothing
6 dim ds as DataSet
7 dim fs as FileStream
8 dim sr as StreamReader
9
10 ds=New DataSet
11 fs=New FileStream(Server.MapPath("custom1.xml"),FileMode.Open,FileAccess.Read)
12 sr=New StreamReader(fs)
13 ds.ReadXml(sr)
14 fs.Close()
15 dv1=new DataView(ds.Tables(0))
16 Cache.Insert("DataCache5",dv1,New cachedependency(Server.MapPath("custom1.xml")))
17 lblMsg.text="数据从文件中读出"
18 Else
19 lblmsg.text="数据从缓存中读出"
20 end if
21'绑定到DataGrid1对象
22 DataGrid1.datasource = dv1
23 DataGrid1.databind()
24end sub
25sub Page_Load(s as object,e as eventargs)
26'加载页面时,从文件中读出客户信息
27 if Not IsPostBack
28 LoadData1()
29 end if
30end sub
31sub AddBtn_Click(s as object,e as eventargs)
32'增加一个客户信息到文件中
33dim FS as FileStream
34dim Reader as StreamReader
35dim DS as DataSet
36dim dr1 as DataRow
37dim tw1 as TextWriter
38 if Not Page.IsValid
39 lblMsg.text="还有域未曾填充"
40 else
41 DS=New DataSet()
42 FS=New FileStream(Server.mappath("custom1.xml"),FileMode.Open,FileAccess.Read,FileShare.ReadWrite)
43 Reader=New StreamReader(FS)
44 DS.readxml(Reader)
45 FS.Close()
46 dr1=DS.tables(0).newrow()
47 dr1("CustName")=txtName.text
48 dr1("CustIdno")=txtIdno.text
49 dr1("CustCard")=txtCard.text
50 DS.tables(0).rows.add(dr1)
51
52 FS=New FileStream(Server.MapPath("custom1.xml"),FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite)
53 tw1=New StreamWriter(FS)
54 tw1=textwriter.synchronized(tw1)
55 DS.writexml(tw1)
56 tw1.close()
57 LoadData1()
58 end if
59end sub
60sub RefreshBtn_Click(s as object,e as eventargs)
61 LoadData1()
62end sub
63
2'当缓存对象DataCache5有效时,从缓存中读出客户信息;无效时,从文件读出信息
3dim dv1 as DataView
4 dv1=Cache("DataCache5")
5 if dv1 = Nothing
6 dim ds as DataSet
7 dim fs as FileStream
8 dim sr as StreamReader
9
10 ds=New DataSet
11 fs=New FileStream(Server.MapPath("custom1.xml"),FileMode.Open,FileAccess.Read)
12 sr=New StreamReader(fs)
13 ds.ReadXml(sr)
14 fs.Close()
15 dv1=new DataView(ds.Tables(0))
16 Cache.Insert("DataCache5",dv1,New cachedependency(Server.MapPath("custom1.xml")))
17 lblMsg.text="数据从文件中读出"
18 Else
19 lblmsg.text="数据从缓存中读出"
20 end if
21'绑定到DataGrid1对象
22 DataGrid1.datasource = dv1
23 DataGrid1.databind()
24end sub
25sub Page_Load(s as object,e as eventargs)
26'加载页面时,从文件中读出客户信息
27 if Not IsPostBack
28 LoadData1()
29 end if
30end sub
31sub AddBtn_Click(s as object,e as eventargs)
32'增加一个客户信息到文件中
33dim FS as FileStream
34dim Reader as StreamReader
35dim DS as DataSet
36dim dr1 as DataRow
37dim tw1 as TextWriter
38 if Not Page.IsValid
39 lblMsg.text="还有域未曾填充"
40 else
41 DS=New DataSet()
42 FS=New FileStream(Server.mappath("custom1.xml"),FileMode.Open,FileAccess.Read,FileShare.ReadWrite)
43 Reader=New StreamReader(FS)
44 DS.readxml(Reader)
45 FS.Close()
46 dr1=DS.tables(0).newrow()
47 dr1("CustName")=txtName.text
48 dr1("CustIdno")=txtIdno.text
49 dr1("CustCard")=txtCard.text
50 DS.tables(0).rows.add(dr1)
51
52 FS=New FileStream(Server.MapPath("custom1.xml"),FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite)
53 tw1=New StreamWriter(FS)
54 tw1=textwriter.synchronized(tw1)
55 DS.writexml(tw1)
56 tw1.close()
57 LoadData1()
58 end if
59end sub
60sub RefreshBtn_Click(s as object,e as eventargs)
61 LoadData1()
62end sub
63
(2)初始运行效果
初始时,应用空间中无“DataCache”缓存对象,故文件从custom1.xml中读出客户信息,开始时为空,只显示了字段名。
(3)当添加一个用户信息后,文件custom1.xml发生改变,导致“DataCache5”对象无效,
LoadData1过程依然从文件custom1.xml中读取信息,并更新DataCache5对象。
(4)由于custom1.xml文件未曾发生改变,所以当按下“刷新“按钮后,信息却是从缓存对象DataCach5中读出来。
页面数据缓存技术可能比页面输出缓存技术使用得更普遍一些。