您的位置:首页 > 编程语言 > ASP

ASP.Net性能优化——页面数据缓存

2008-06-23 19:59 393 查看
 

新一篇: 声明-------

1 基本概念
        ASP.NET提供了一个相当出色的缓存引擎机制,它允许页面保存和索引HTTP请求所要求的各种各样的对象。ASP.NET的缓存对各个应用来说是私有的,是存储各种对象的存储器。缓存的生存周期取决于应用的生存周期,也就是说,当应用重新启动时,缓存实际上也已重建。
        缓存提供了一个简单的字典接口,以便于开发者能够轻而易举放置对象到缓存中,并在以后使用。最简单的情况下,放置一个对象到缓存中,就如同对字典增加一个条目。
例如:

1

Cache(“myKey”)=MyValue
2

即是把MyValue放入缓存中一个叫myKey的缓存对象中,当需要引用myKey值时,可以采用下面的使用方式:
3

myValue1=Cache(“myKey”)
4

if myValue1 <> Null then
5

'非空时的动作
6


7

end 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"
32

Display="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"
38

Display="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>

 1



Sub LoadData1()sub LoadData1
 2

'当缓存对象DataCache5有效时,从缓存中读出客户信息;无效时,从文件读出信息
 3

dim 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()
24

end sub
25



Sub Page_Load()sub Page_Load(s as object,e as eventargs)
26

'加载页面时,从文件中读出客户信息
27

    if Not IsPostBack
28

    LoadData1()
29

    end if
30

end sub
31



Sub AddBtn_Click()sub AddBtn_Click(s as object,e as eventargs)
32

'增加一个客户信息到文件中
33

dim FS as FileStream
34

dim Reader as StreamReader
35

dim DS as DataSet
36

dim dr1 as DataRow
37

dim 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
59

end sub
60



Sub RefreshBtn_Click()sub RefreshBtn_Click(s as object,e as eventargs)
61

    LoadData1()
62

end sub
63


(2)初始运行效果
         初始时,应用空间中无“DataCache”缓存对象,故文件从custom1.xml中读出客户信息,开始时为空,只显示了字段名。



(3)当添加一个用户信息后,文件custom1.xml发生改变,导致“DataCache5”对象无效,

LoadData1过程依然从文件custom1.xml中读取信息,并更新DataCache5对象。



(4)由于custom1.xml文件未曾发生改变,所以当按下“刷新“按钮后,信息却是从缓存对象DataCach5中读出来。



页面数据缓存技术可能比页面输出缓存技术使用得更普遍一些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息