找回密码
 加入怎通
查看: 715|回复: 8

[站长八卦] 有关一些ASP.NET 2.0的缓存说明

[复制链接]
Q18310195 发表于 2013-01-15 14:29:43 | 显示全部楼层 |阅读模式
由数据库驱动的Web应用程序,如果需要改善其性能,最好的方法是使用缓存功能。用户从数据库中检索数据,可能是Web应用程序中执行最慢的操作之一。因为其中涉及多个环节,例如,Web服务器、数据库服务器等。尤其是在用户比较多,检索的数据量比较大的情况下,会给包括用户在内的各个方面造成不小的困难。如果能够将数据库中的数据缓存到内存(也可以存储在其他场所),则无需在请求每个页面时都访问数据库。由于从内存中返回数据的速度始终比新提供的数据速度快,因而可以大大提供应用程序的性能。   
/ [+ i# V$ d* t! n/ }( R. |) A: O8 ^5 `) S% s+ ?. B
    缓存有一个不太容易克服的缺点,那就是数据过期的问题。最典型的情况是,如果将数据库表中的数据内容缓存到服务器内存中,当数据库表中的记录发生更改时,Web应用程序则很可能显示过期的、不准确的数据。对于某些类型的数据,即使显示的信息过期,影响也不会很大。然而,对于实时性要求比较严格的数据,例如,**价格、拍卖出价之类信息,显示的数据稍有过期都是不可接受的。    - B/ W# s3 ~0 a  ~% u

9 `, y1 `' X8 |) n( v, t    为了解决以上问题,ASP.net 1.x中曾经提供了一些比较好的缓存功能,例如,页面输出缓存、部分缓存、页面数据缓存等。虽然这些缓存功能可以解决数据缓存方面的问题,但还是存在较大的缺点,开发人员必须在性能和数据过期之间作出权衡,数据过期的问题始终困扰着开发人员。例如,如果数据库表中的数据发生了变化,缓存则也许不能在指定的时间内更新,而必须等到缓存过期,那么就有可能为用户带来一定的麻烦。理想的情况是,数据库表中的任何更新,都能够立刻体现在缓存数据中,ASP.NET 2.0克服了以上不足,解决了这个问题。ASP.NET 2.0的缓存功能是在ASP.NET 1.x基础之上扩展而来的。   
2 `) m1 }% z; _0 j1 ^
& W! c% r1 ]4 \- z6 O    ASP.NET 2.0支持以下几种缓存    ) W" `5 {- k+ S* f, C' P  g
8 t9 A0 r( D% {$ z, m5 V9 D! _# J$ [
    ·页面输出缓存    ' A- O- T# |  i3 S, w3 ^/ v* L
) J$ e  ~% B7 S, b+ m( }2 M
    页面输出缓存是最为简单的缓存机制,该机制将整个ASP.NET页面内容保存在服务器内存中。当用户请求该页面时,系统从内存中输出相关数据,直到缓存数据过期。在这个过程中,缓存内容直接发送给用户,而不必再次经过页面处理生命周期。通常情况下,页面输出缓存对于那些包含不需要经常修改内容的,但需要大量处理才能编译完成的页面特别有用。需要读者注意的是,页面输出缓存是将页面全部内容都保存在内存中,并用于完成客户端请求。   
( H3 N; q1 w  {1 K+ y2 I/ `4 p+ y( ?4 y" l; ?3 N/ F
    ·页面部分缓存    8 Q1 R9 K- K; k. B

! t0 o2 [* j9 h% o  R# v    顾名思义,页面部分缓存是将页面部分内容保存在内存中以便响应用户请求,而页面其他部分内容则为动态内容。页面部分缓存的实现包括两种方式:控件缓存和替换后缓存。前者也可称为片段缓存,这种方式允许将需要缓存的信息包含在一个用户控件内,然后,将该用户控件标记为可缓存的,以此来缓存页面输出的部分内容。这一方式缓存了页面中的特定内容,而没有缓存整个页面,因此,每次都需重新创建整个页。例如,如果要创建一个显示大量动态内容(如**信息)的页,其中有些部分为静态内容(如每周总结),这时可以将静态部分放在用户控件中,并允许缓存这些内容。缓存后替换与控件缓存正好相反。这种方式缓存整个页,但页中的各段都是动态的。例如,如果要创建一个在规定时间段内为静态的页,则可以将整个页设置为进行缓存。如果向页添加一个显示用户名的Label控件,则对于每次页刷新和每个用户而言,Label的内容都将保持不变,始终显示缓存该页之前请求该页的用户的姓名。使用缓存后替换机制,可以将页配置为进行缓存,将页的个别部分标记为不可缓存。在此情况下,可以向不可缓存部分添加Label控件,这样将为每个用户和每次页请求动态创建这些控件。   
# N3 @) l* ~* G: N- j* z
% Z* f1 X) T! R8 p& _    ·应用程序数据缓存   
$ F+ n6 t1 c6 L
7 s2 q3 j# @# K+ S0 }+ f+ ?0 z9 j2 `    应用程序数据缓存提供了一种编程方式,可通过键/值对将任意数据存储在内存中。使用应用程序缓存与使用应用程序状态类似。但是,与应用程序状态不同的是,应用程序数据缓存中的数据是易失的,即数据并不是在整个应用程序生命周期中都存储在内存中。应用程序数据缓存的优点是由ASP.NET管理缓存,它会在项过期、无效,或内存不足时移除缓存中的项,还可以配置应用程序缓存,以便在移除项时通知应用程序。 & L0 P2 @7 N8 l1 \  w7 E
0 F6 z9 U+ B6 }9 t% x
    ·缓存依赖    ' L3 \' r, V% H# B% k$ t: ~: \
: m* d: y) w- n$ q) A3 m- @8 _
    ASP.NET 1.x已经提供了一些基于时间、文件、目录等缓存依赖功能。这些功能虽然能够处理一些常见问题,但是无法解决数据过期的难题。为此,ASP.NET 2.0新增了SQL数据缓存依赖功能。该功能的核心是SqlCacheDependency类。不同版本的SQL Server,其对于SQL数据缓存依赖具有不同程度的支持,因此,使用方法差异较大。另外,ASP.NET 2.0还支持以CacheDependency类为核心的自定义缓存依赖,以及以AggregateCacheDependency类为核心的聚合缓存依赖等。   3 ]9 L5 |5 Y. u9 p7 a0 _" U1 |. {4 o
* b6 R. l8 [8 l1 a' E. p2 S
 ASP.NET2.0包括了一些有助于进行缓存配置的新功能。例如,允许使用Web.config文件来创建缓存设置。在Web.config文件中进行适当设置,并在单个页中引用这些设置后,就能够将缓存设置同时应用于多个页面。同时,缓存设置还添加了更多用于自定义缓存性能的选项。   
* p% d( }* A; Q4 v7 F+ {& h# }
: ]; u8 e3 M+ s3 n0 `+ U    以上简单介绍了ASP.NET 2.0提供的缓存功能,它们能够提高请求响应的吞吐量以便提高应用程序性能。实际上,这些缓存功能有的继承自ASP.NET 1.x,并且得到了增强,有的则是新增功能。增强功能包括功能更强大的页面部分缓存模型、增强的缓存配置以及输出缓存指令的改进。新功能包括Web.config缓存配置支持、自定义缓存依赖、聚合缓存依赖、SQL数据缓存依赖以及缓存后替换等。   
( L5 H. t% {7 C$ k3 d7 S0 c# u! Z9 P3 d+ `" f7 [5 V
    在正式开始介绍以上各个缓存功能之前,还有两个概念需要了解。一个是缓存清除,另一个是缓存过期。   
! w5 m/ Q2 A8 `" A. w' n1 t3 w  F* h/ x$ m1 X
    缓存清除是指从内存中移除缓存数据。可能由以下3个原因造成:一是缓存项数据过期。每个过期的缓存项数据都必须被删除,否则导致服务器内存不足,影响其他应用程序执行。二是缓存依赖项发生改变。依赖项与数据缓存项有着密切关系。根据应用程序设置,如果依赖项发生改变,那么数据缓存很可能会被清除。三是由于服务器内存不足,开始缓存清理过程。如果某些项在一段时间内未被访问,或是在添加到缓存中时被标记为低优先级,则这些项会被移除。   ! Z7 A% L. B$ T' f0 L8 H. d

6 b0 A' Y9 {/ V9 `    以上介绍了缓存清除的概念和形成原因,其中涉及一个数据过期的问题。在ASP.NET 2.0中,当向缓存添加项时,可以设置两种数据过期类型。一种称为可调过期,即指定某项自上次被访问后多长时间过期。例如,可以将某项设置为自上次在缓存中被访问后20分钟过期。另一种是绝对过期,即指定某项在设定的时间过期,而不考虑访问频率。例如,可以将某项设置为在下午6点过期,或4小时后过期。   & M* w# ?! p9 M6 S# k7 c
* J% r$ a, D( J% j/ o
    ASP.NET 2.0的缓存功能具有以下优点:    * [) }* Y6 E6 ^# y

! S7 _( p; t4 Y& x& e6 u2 S8 j2 e    ·支持更为广泛和灵活的可开发特征    % s9 X0 _, z2 n; B" q& n$ g4 U: s4 p: ^

3 ]* m. I1 {$ L- O; e. J    ASP.NET 2.0包含一些新增的缓存控件和API。例如,自定义缓存依赖、Substitution控件、页面输出缓存API等,这些特征能够明显改善开发人员对于缓存功能的控制。   : I* d  _1 u0 c. A
$ w  @: ]$ s9 h# m6 O3 n
    ·增强的可管理性    4 p. o7 x5 @1 s% b" M
: T; x4 H& G3 J1 J( X
    使用ASP.NET 2.0提供的配置和管理功能,可以更加轻松地管理缓存功能。 3 ]9 M0 l" C+ x! J  ~6 p+ ]

" J/ C0 b# s" M7 C4 f9 \* x    ·提供更高的性能和可伸缩性    0 g( E/ Z) u8 r4 r
( v: }1 e! }$ f% }) X
    ASP.NET 2.0提供了一些新的功能,例如,SQL数据缓存依赖等,这些功能将帮助开发人员创建高性能、伸缩性强的Web应用程序。   
2 Z+ u% S  t/ l0 K- }9 Q; C  _) V    另外,缓存功能也有其自身的不足。例如,显示的内容可能不是最新、最准确的,为此,必须设置合适的缓存策略。又如,缓存增加了系统的复杂性并使其难于测试和调试,因此建议在没有缓存的情况下开发和测试应用程序,然后在性能优化阶段启用缓存选项。
5 S- o& h- L) W0 A湖盟云防火墙3 B% I+ Y+ F4 I3 ?& x) v, J: t' S

9 h  G' J3 N$ Q. u6 \1 l( Z4 A

暂时无法加载帖子列表

回复

使用道具 举报

Sabey 发表于 2013-01-15 14:31:00 | 显示全部楼层
我擦,得好好研究一下
回复

使用道具 举报

参与就好 发表于 2026-03-13 13:24:48 | 显示全部楼层
完全赞同,我也是这么认为的,英雄所见略同~
回复

使用道具 举报

皮蛋 发表于 2026-07-13 03:41:34 | 显示全部楼层
学习到了,之前一直没注意过这个点,受教了
回复

使用道具 举报

lisure 发表于 2026-07-17 10:20:45 | 显示全部楼层
楼主辛苦了,整理这么多内容,必须点赞收藏
回复

使用道具 举报

BTS2 发表于 2026-07-23 09:24:21 | 显示全部楼层
分析得很透彻,很多细节都说到点子上了~
回复

使用道具 举报

深圳艺立 发表于 2026-07-24 03:30:16 | 显示全部楼层
说得很实在,没有夸大其词,这种真实分享太难得了
回复

使用道具 举报

yanyan 发表于 2026-07-24 05:36:50 | 显示全部楼层
这个分享太实用了,刚好能用到,感谢楼主!
回复

使用道具 举报

我一直都在 发表于 2026-07-30 13:26:45 | 显示全部楼层
刚好遇到类似问题,看完这个帖子心里有底了
回复

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-9-13 16:24 , Processed in 0.053396 second(s), 25 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表