asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

提高ASP.Net应用程序性能的十大方法[2]


发布日期:2024年07月31日
 
提高ASP.Net应用程序性能的十大方法[2]

ASPNET缓存API

在写应用程序之前你要做的第一件事是让应用程序最大化的利用ASPNET的缓存功能

如果你的组件是要在Aspnet应用程序中运行你只要把SystemWebdll引用到你的项目中就可以了然后用HttpRuntimeCache属性就可访问Cache了(也可以通过PageCache或HttpContextCache访问)

有以下几条缓存数据的规则第一数据可能会被频繁的被使用这种数据可以缓存第二数据的访问频率非常高或者一个数据的访问频率不高但是它的生存周期很长这样的数据最好也缓存起来第三是一个常常被忽略的问题有时候我们缓存了太多数据通常在一台X的机子上如果你要缓存的数据超过M的话就会出现内存溢出的错误所以说缓存是有限的换名话说你应该估计缓存集的大小把缓存集的大小限制在以内否则它可能会出问题在Aspnet中如果缓存过大的话也会报内存溢出错误特别是如果缓存大的DataSet对象的时候

这里有几个你必须了解的重要的缓存机制首先是缓存实现了最近使用原则( a leastrecentlyused algorithm)当缓存少的时候它会自动的强制清除那些无用的缓存其次 条件依赖强制清除原则(expiration dependencies)条件可以是时间关键字和文件以时间作为条件是最常用的在aspnet中增加一更强的条件就是数据库条件当数据库中的数据发生变化时就会强制清除缓存要更深入的了解数据库条件依赖请看Dino Esposito 在MSDN杂志年七月刊的Cutting Edge专栏文章Aspnet的缓存架构如下图所示

预请求缓存

在前面我提到过即使我们只对某些地方作了一个小小的性能改进也可以获得大的性能提升我非常喜欢用预请求缓存来提升程序的性能

虽然Cache API设计成用来保存某段时间的数据而预请求缓存只是保存某个时期的某个请求的内容如果某个请求的访问频率高而且这个请求只需要提取应用修改或者更新数据一次那么就可以预缓存该请求我们举个例子来说明

在CS的论坛应用程序中每一个页面的服务器控件都要求得到用于决定它的皮肤(skin)的自定义的数据以决定用哪个样式表及其它的一些个性化的东西这里面的某些数据可能要长时间的保存有些时间则不然如控件的skin数据它只需要应用一次而后就可以一直使用

要实现预请求缓存用Aspnet 的HttpContext类HttpContext类的实例在每一个请求中创建在请求期间的任何地方都可以通过HttpContextCurrent属性访问HttpContext类有一个Items集合属性在请求期间所有的对象和数据都被添加到这个集合中缓存起来和你用Cache缓存访问频率高数据一样你可以用HttpContextItems缓存那些每个请求都要用到的基础数据它背后的逻辑很简单我们向HttpContextItems中添加一个数据然后再从它里面读出数据

后台处理

通过上面的方法你的应用程序应该运行得很快了是不是?但是在某些时候程序中的一次请求中可能要执行一个非常耗时的任务如发送邮件或者是检查提交的数据的正确性等

当我们把aspnet Forums 集成在CS中的时侯发现提交一个新的帖子的时候会非常的慢每次新增一个帖子的时侯应用程序首先要检查这个帖子是不是重复提的然后用badword过滤器来过滤检查图片附加码作帖子的索引把它添加到合适的队列中验证它的附件最后发邮件到它的订阅者邮件箱中显然这个工作量很大

结果是它把大量的时间都花在做索引和发送邮件中了做帖子的索引是一项很耗时的操作而发邮件给订阅都需要连接到SMTP服务然后给每一个订阅者都发一封邮件随着订阅用户的增加发送邮件的时间会更长

索引和发邮件并不需要在每次请求时触发理想状态下我们想要批量的处理这些操作每次只发封邮件或者每隔分钟把所有的要发的新邮件发一次我们决定使用与数据库原型缓存一样的代码但是失败了所以又不得不回到VSNET

我们在SystemThreading命名空间下找到了Timer类这个类非常有用但却很少有人知道Web开发人员则更少有人知道了一旦他建了该类的实例每隔一个指定的时间Timer类就会从线程池中的一个线程中调用指定的回调函数这意味着你的aspnet应用程序可以在没有请求的时候也可以运行这就是后以处理的解决方案你就可以让做索引和发邮件工作在后台运行而不是在每次请求的时候必须执行

后台运行的技术有两个问题第一是当你的应用程序域卸载后Timer类实例就会停止运行了也就是不会调用回调方法了另外因为CLR的每个进程中都有许多的线程在运行你将很难让Timer获得一个线程来执行它或者能执行它但会延时Aspnet层要尽量少的使用这种技术以减少进程中线程的数量或者只让请求用一小部分的线程当然如果你有大量的异步工作的话那就只能用它了

[] [] []

               

上一篇:提高ASP.Net应用程序性能的十大方法[3]

下一篇:详解ASP.NET清除HTML标记的函数