.Net的缓存机制大比拼。

ASP.NET提供了一种将数据或者页面缓存到内存的方法,掌握此方法并在适当的地方使用后可以让ASP.NET程序的性能得到十分明显的提升,很不幸的是在这里居然没有看见一个帖子好好的讨论过缓存这个东西,甚至很少有人提及!

缓存可以很好的解决效率问题,但必须建立在熟练的掌握缓存的使用方法,很好的控制住,否则会适得其反,但该如何掌握缓存?如何控制好他?希望大家就此话题好好的说说,也请各位MVP各位高手指点指点! 问题点数:20、回复次数:87Top

1 楼cnlamar(无中生有) 回复于 2003-09-24 00:42:59 得分 0

我觉得可以在以下几个地方合理的使用缓存

1、数据缓存,将需要的数据缓存一段时间,减少与数据库的读写次数,提升性能!
2、将某些流量特别相对整个程序最大的页面进行完整缓存!

第一个方法,必须控制好超时的时间,以及缓存的更新控制!
第二个方法,则必须控制好页面缓存结构,在数据更新的时候及时更新缓存!

小弟学.net不过十几天的时间,可能有的地方看得太浅显,甚至看法直接就是错误的,请各位斧正,谢谢!

希望看见的朋友都帮忙提提,更希望斑竹能满足一个小小的愿望,置顶几天……Top

2 楼softye(阿申) 回复于 2003-09-24 00:56:10 得分 0

GZTop

3 楼saucer(思归) 回复于 2003-09-24 01:50:13 得分 10

use OutputCache, use VaryByParam, VaryByControl, or in your case, you can consider to use VaryByCustom. You need to override HttpApplication.GetVaryByCustomString in global.asaxTop

4 楼cnlamar(无中生有) 回复于 2003-09-24 04:17:18 得分 0

VaryByCustom
思归大哥的意思是叫我将一些数据在程序开始的时候放在一个全局变量里?然后从这里读数据?
使用参数来控制多个版本的页面缓存?这个倒是好办,关键是怎么在页面中的数据被更新的时候放弃缓存呢?而更新又在另一个地方~Top

5 楼dattotzy(什么叫做酷?三年一条牛仔裤!) 回复于 2003-09-24 04:24:56 得分 0

我曾经做过一个程序就是数据量特别的大,每次的查询都有几十万条数据,后来我没有办法只好将用户可以选择的查询时间设置为最大1小时,这样还有6万多条数据,我到现在也没有想出很好的解决办法(我是用datagrid绑定的数据显示)。Top

6 楼saucer(思归) 回复于 2003-09-24 05:09:46 得分 0

don't know exactly what you want, but try

<%@ OutputCache Duration="60" VaryByCustom="CustomString" %>

>>>在页面中的数据被更新的时候放弃缓存

say, after 数据被更新 on pageid=11 , you do

Application["11"] = DateTime.Now.ToString();


public override string GetVaryByCustomString(HttpContext context, string arg)
{
If (arg == "CustomString")
{
//look up the page id from context.Request.RawUrl
//as long as you didn't change the value, it will use an earlier version
return (string)Application[YourPageID].ToString();
}
}
Top

7 楼saucer(思归) 回复于 2003-09-24 05:10:58 得分 0

>>>>后来我没有办法只好将用户可以选择的查询时间设置为最大1小时????

use custom paging, only select out the records for the current page!Top

8 楼bobjeey(三十年河东,三十年河西) 回复于 2003-09-24 09:15:25 得分 0

我在程序中每个用户的菜单是可能不同的(菜单是读数据库,分权限而不同,大概有十多个不同的权限级,而且会随时更新),又如何实现这样的缓存呢。Top

9 楼bpy(历为) 回复于 2003-09-24 10:42:16 得分 0

gzTop

10 楼YAOTIEBING(寻找失去的自我) 回复于 2003-09-24 11:01:43 得分 0

链接池

数据库链接池使应用程序能够重用池中的现有链接,而不是重复地建立对数据库的链接。这种技术将极大地增加应用程序的可伸缩性,因为有限的数据库链接可以为很多的客户提供服务。此技术也将提高性能,因为能够避免用于建立新链接的巨大时间。

数据访问技术,如ODBC和OLE DB,提供了多种形式的链接池,它们可配置到不同级别上。这两种方式对数据库客户端应用程序来说都是透明的。OLE DB链接池经常被称为会话或资源池。

关于微软数据访问组件(MDAC)中池的一般讨论,见http://msdn.microsoft.com/library/en-us/dnmdac/html/pooling2.asp。

ADO.NET数据提供程序提供了透明的链接池,每种链接池的确切机制对每种提供程序来说是不同的。本节讨论的链接池是关于:

SQL Server .NET数据提供程序 (http://msdn.microsoft.com/library/en-us/dnbda/html/daag.asp)
OLE DB .NET数据提供程序 (http://msdn.microsoft.com/library/en-us/dnbda/html/daag.asp)
用SQL Server .NET 数据提供程序池化

如果正在使用SQL Server .NET数据提供程序,那么就可使用该提供程序提供的链接池化支持特性。它是由提供程序在托管代码内内置实现的对事务敏感的高效机制。每个过程都将创建池,并且直到过程结束,池才被取消。

你可以透明地使用此种链接池,但应当清楚池是如何被管理的,并要知道可以用哪些选项来调整链接池。

如何配置SQL Server .NET数据提供程序链接池

可以使用一组名称-值对以链接字符串的形式配置链接池。例如,可以配置池是否有效(默认是有效的),池的最大、最小容量,用于打开链接的排队请求被阻断的时间。下面的示例字符串配置了池的最大和最小容量。

"Server=(local); Integrated Security=SSPI; Database=Northwind;
Max Pool Size=75; Min Pool Size=5"
当链接打开,池被创建时,多个链接增加到池中以使链接数满足所配置的最小值。此后,链接就能增加到池中,直到配置的最大池计数。当达到最大计数时,打开新链接的请求将排队一段可配置的时间。

选择池容量

能建立最大极限对于管理几千用户同时发出请求的大型系统来说是非常重要的。你需要监视链接池及应用程序的性能,以确定系统的最优池容量。最优容量还要依赖于运行SQL Server的硬件。

在开发期间,也许需要减小默认的最大池容量(目前是100)以帮助查找链接泄漏。

如果设立了最小池容量,那么当池最初被填充以达到该值时,会导致一些性能损失,尽管最初链接的几个客户会从中受益。注意,创建新链接的过程被序列化了,这就意味着当池最初被填充时,服务器无法处理同时发生的请求。

关于监视链接池的更多信息,见本文监视链接池一节。关于链接池链接字符串关键字的完整列表,见http://msdn.microsoft.com/library/en-us/cpguide/html/cpconconnectionpoolingforsqlservernetdataprovider.asp。

Top

11 楼xxrl(孔曰成仁,孟曰取媳妇-->她太有才了) 回复于 2003-09-24 11:56:02 得分 0

studyTop

12 楼duibudui() 回复于 2003-09-24 12:14:25 得分 0

学习Top

13 楼jxf_yx(清风) 回复于 2003-09-24 12:26:08 得分 0

gz!!!Top

14 楼adminlxj79(lixj) 回复于 2003-09-24 13:05:52 得分 0

学习。。。。Top

15 楼gujie(eyes) 回复于 2003-09-24 13:13:46 得分 0

思归兄:

你可以到下面的地址去打中文:
http://eyes.533.net/wb.htm 五笔
http://eyes.533.net/py.htm 拼音Top

16 楼dattotzy(什么叫做酷?三年一条牛仔裤!) 回复于 2003-09-24 13:23:27 得分 0

>>>>后来我没有办法只好将用户可以选择的查询时间设置为最大1小时????

use custom paging, only select out the records for the current page!
>>>>>>>>>
我没有用过custom pageing ,so I cannot understand your means.Top

17 楼cnlamar(无中生有) 回复于 2003-09-24 13:36:34 得分 0

思归大哥的意思是让我将一个页面的过期条件设置为Application里的一个变量,然后在更新数据库的同时更新这个变量的值?让页面过期?这似乎不错,但还有个问题,不知是否能够解决,假如我的这个页面还用了分页,就有了page,用了分类,有了class这两个参数,需要做到很详尽的规划,又class和page来控制缓存的版本,而当我对某个CLASS的数据更新的时候,则将此CLASS下的所有PAGE过期,而其他CLASS的版本则不进行过期操作,似乎就不好办了?单用这个好象实现不了?

bobjeey,你那样的就不适合做页面缓存了,不过可以做一些数据缓存,依旧可以提高一定的性能:)

YAOTIEBING:光靠连接池是无法将效率提升到可能的最大限度的:)

gujie:哈哈,看来你的英语比我强不了多少。。。Top

18 楼cnlamar(无中生有) 回复于 2003-09-24 14:05:11 得分 0

如果我没理解错,思归大哥的想法是将一个页面的URL作为ID,然后设置为Application对象中的一个键,当数据更新的时候更新他的值,再将这个ID作为页面的缓存更新条件?

这样应该可以控制页面缓存的过期,但当一个页面有多个版本的时候呢?

假如这样一个
http://127.0.0.1/app.aspx?class=1&page=2

这样的话假如我在class1中更新了数据,就需要将class1中所有的页面版本全部更新,不去管page,而平时,又需要根据page的不同来建立多个版本?

这样呢?似乎就不好办了?Top

19 楼gawz(小蟲) 回复于 2003-09-24 17:20:05 得分 0

学习Top

20 楼saucer(思归) 回复于 2003-09-24 17:30:00 得分 0

很多东西没有两全其美的方法,很多时候只能尽力而为

下列方法没试过,但想当然地应该工作

say, only for app.aspx,
<%@ OutputCache Duration="60" VaryByParam="class;page" VaryByCustom="CustomString" %>

>>>>我在class1中更新了数据,就需要将class1中所有的页面版本全部更新,不去管page,而平时,又需要根据page的不同来建立多个版本?

after you modified the data, get the number of pages, then do
for(int i=0; i < pageNumber, i++)
Application[SomeVariableBasedOnYourPageNumber] = DateTime.Now.ToString();

public override string GetVaryByCustomString(HttpContext context, string arg)
{
If (arg == "CustomString")
{
//look up the page id from context.Request.RawUrl
//as long as you didn't change the value, it will use an earlier version
return (string)Application[SomeVariableBasedOnYourPageNumber];
}
}
Top

21 楼sunpopoapollo(e无so有) 回复于 2003-09-24 17:39:30 得分 0

learning....Top

22 楼siugwan(开怀) 回复于 2003-09-24 18:06:18 得分 0

学习Top

23 楼cnlamar(无中生有) 回复于 2003-09-24 19:55:47 得分 0

先顶一个,看见思归的中文也带着老美的感觉,呵呵,不过能见他写中文也不容易了:D
静态全局DataTable的问题解决了,准备跟着思归大哥说的摸索一下,完了回来给大家看结果Top

24 楼cnlamar(无中生有) 回复于 2003-09-24 20:52:46 得分 0

思归大哥,有个疑惑,通过设置VaryByCustom="CustomString"
是说按照参数CustomString来划分版本,我将他绑定给一个变量,这能行吗?


for(int i=0; i < pageNumber, i++)
Application[SomeVariableBasedOnYourPageNumber] = DateTime.Now.ToString();
这个是用来在数据库发生更改的时候,将所有page参数的版本过期?

public override string GetVaryByCustomString(HttpContext context, string arg)
{
If (arg == "CustomString")
{
//look up the page id from context.Request.RawUrl
//as long as you didn't change the value, it will use an earlier version
return (string)Application[SomeVariableBasedOnYourPageNumber];
}
}

这个是用来设置一个变量作为过期与否的标志?

好多太吗实在看不懂,请思归大哥指点,谢谢Top

25 楼MasterLRC(但丁) 回复于 2003-09-24 21:00:16 得分 0

MARK!!Top

26 楼yyfa6(yyfa6) 回复于 2003-09-24 23:25:32 得分 0

gzTop

27 楼jackzhanyi(时间+用功=成功) 回复于 2003-09-24 23:44:12 得分 0

gzTop

28 楼cnlamar(无中生有) 回复于 2003-09-25 00:49:24 得分 0

贴一段关于用自定义字符串来控制缓存的版本,希望对大家有帮助,我正在看,看完了再来写心得体会:D


------------------------------------------------------
除了根据浏览器类型改变输出缓存之外,@ OutputCache 指令的 VaryByCustom 属性和 HttpCachePolicy.SetVaryByCustom 方法允许根据您定义的自定义字符串缓存页输出的多个版本。

当选择使用两种技术中的任何一种扩展输出缓存的功能时,您必须在应用程序的 Global.asax 文件中重写 HttpApplication.GetVaryByCustomString 方法。您在重写语句中编写的代码定义应用程序如何缓存根据自定义字符串或您指定的字符串改变的任何页输出。

根据自定义字符串以声明方式缓存页输出的多个版本

在 .aspx 文件中,将 @OutputCache 指令与必需的 Duration 和 VaryByParam 属性包括在一起。必须将 Duration 属性设置为大于零的任意整数。如果不想使用 VaryByParam 属性提供的功能,请将其值设置为 None。
在 @OutputCache 指令体中包括 VaryByCustom 属性,该属性设置为要根据其改变输出缓存的字符串。下面的指令根据自定义字符串“minorversion”改变页输出。
<%@ OutputCache Duration="10" VaryByParam="None" VaryByCustom="minorversion" %>

在应用程序的 global.asax 文件的代码声明块中,重写 GetVaryByCustomString 方法来为自定义字符串指定输出缓存的行为。
根据自定义字符串以编程方式缓存页输出的多个版本

在该页的代码声明块或代码隐藏类中,使用 Response.Cache 语法为已缓存的页面内容设置到期和可见性策略。您可以分别使用 HttpCachePolicy.SetExpires 和 HttpCachePolicy.SetCacheability 方法来完成此任务。有关更多信息,请参见设置页缓存的到期时间和设置页的可缓存性。
在相同的代码中,在 SetVaryByCustom 方法的 custom 参数中指定自定义字符串。以下代码将自定义字符串设置为“minorversion”。
[C#]
Response.Cache.SetVaryByCustom("minorversion");

[Visual Basic]
Response.Cache.SetVaryByCustom("minorversion")

在应用程序的 Global.asax 文件的代码声明块中,重写 GetVaryByCustomString 方法来为自定义字符串指定输出缓存的行为。
下面的示例演示一个简单的 Global.asax 文件,当应用程序中某页将自定义字符串 minorversion 传递到该文件时,该文件将重写 GetVaryByCustomString 方法。

[C#]
<script>
public override string GetVaryByCustomString(HttpContext context, string arg){
If (arg = "minorversion"){
Return "Version=" + context.Request.Browser.MinorVersion.ToString();
}
}
</script>

[Visual Basic]
<script>
Public Overrides Function GetVaryByCustomString(context As HttpContext, arg As String) As String
If (arg = "minorversion") Then
return "Version=" & context.Request.Browser.MinorVersion.ToString()
End If
End Function
</script>

下面的示例是一个与前面的 Global.asax 文件交互的页,用于根据 minorversion 自定义字符串改变输出缓存。

注意 此示例页使用声明性语法来改变输出缓存。如果要以编程方式进行此操作,将类似于设置页缓存的到期时间中所显示的代码放置在 <script> 元素的开始和结束标记之间。
[C#]
<%@ OutputCache Duration="30" VaryByParam="none" VaryByCustom="minorversion" %>
<Script language="C#" runat="server">
public void Page_Load(Object sender, EventArgs e) {
browserversion.InnerHtml = Request.Browser.MinorVersion.ToString();
timestamp.InnerHtml = DateTime.Now.ToString("r");
}
</Script>

Varying output by custom string (querystring value): <B id="browserversion" runat="server"/>
<BR>
Added to the cache: <B id="timestamp" runat="server" />

[Visual Basic]
<%@ Page Language="VB" %>
<%@ OutputCache Duration="30" VaryByParam="none" VaryByCustom="minorversion" %>

<Script runat="server">
Public Sub Page_Load
browserversion.InnerHtml = Request.Browser.MinorVersion.ToString()
timestamp.InnerHtml = DateTime.Now.ToString("r")
End Sub
</Script>

Varying output by browser: <B id="browserversion" runat="server"/>
<BR>
Added to the cache: <B id="timestamp" runat="server" />

当以不同的值传递到 HttpBrowserCapabilities.MinorVersion 属性值来请求该示例中的页,将为发出请求的每个浏览器缓存页输出的不同版本。例如,来自 Internet Explorer 5 浏览器的请求导致缓存一个版本,而来自 Internet Explorer 5.5 浏览器的请求导致缓存另一个版本。Top

29 楼cnlamar(无中生有) 回复于 2003-09-25 01:31:10 得分 0

查了两个多小时的资料,终于把原理大概搞清楚了,试成功了页面缓存的多版本控制,思归大哥说的办法是可行的,可以同时按两种参数来缓存页面Top

30 楼cnlamar(无中生有) 回复于 2003-09-25 01:32:34 得分 0

最后一个担心的问题,如果缓存的页面,更新量太大,几乎是及时更新的,那用了这种方法后,会不会反而导致性能下降?毕竟他比正常的方法多了一个过程,而且占用了更多的内存?Top

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值