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

 我来答
新科技17
2022-11-11 · TA获得超过5894个赞
知道小有建树答主
回答量:355
采纳率:100%
帮助的人:74.4万
展开全部

  四 ASP NET缓存API 

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

  如果你的组件是要在Asp net应用程序中运行 你只要把System Web dll引用到你的项目中就可以了 然后用HttpRuntime Cache属性就可访问Cache了(也可以通过Page Cache或HttpContext Cache访问)  

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

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

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

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

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

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

  六 后台处理 

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

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

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

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

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

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

lishixinzhi/Article/program/net/201311/15286

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式