利用Cache技术,来有效的提高ASP.NET网站性能

2014 年 10 月 22 日2160

【IT168技术文档】
本文主要讲述如何利用Cache技术,来有效的提高网站性能。全文共涉及两个示例,一个是以ASP为基础介绍在ASP中使用Cache的方法;另一个则是以ASP.NET为基础,展示ASP.NET中使用Cache的新特性,特别值得一提的是Database dependencies技术,下面将逐步展开全文的讨论。
应用范围和背景

本文适合的读者对象:
熟悉Active Server Page
对.NET架构有一定的了解
对ASP.NET有基础
熟悉Visual Studio.NET使用
有较强的代码阅读学习能力
熟悉Microsoft SQL Server各种工具使用

Applies to:
Microsoft® ASP.NET
Microsoft® Active Server Page
Microsoft SQL Server™2000

信息化的时代已经到来,网站如雨后春笋般越建越多。相应地,开发网站的人专业技术人员也很多。无论是开发有单独服务器或集群的大型网站,还是租用虚拟空间的企业网站,性能(performance)都是重要的技术指标,尤其是首页刷新速度。据统计,对于网站的最终使用者来说,倘若他在5秒之内没有刷新出首页,或者在10秒之内没有刷新出其他页面,多数访问者会产生焦虑感,并对网站的友好度下降。更严重地,若网站由于访问人数太多而导致的服务器瘫痪(这里不考虑DOS or DDOS问题)或出错,则访问者对网站会产生不好的印象。尤其是公司的形象网站或以盈利为目的商业网站,他们对网站性能和稳定性的要求更高。

影响网站性能的因素很多(如虚拟空间或专线的传输速度等),对于开发人员来说,有很多技巧和最佳实现的方法来提高网站的访问速度,包括使用存储过程来提高数据查询效率等各种各种方法(本文不再一一叙述),当然最有效的还是通过合理使用Cache来极大地提高性能。
ASP中Cache动态使用

ASP从发布至今已经7年了,使用ASP技术已经相当成熟,自从微软推出了ASP.NET之后就逐渐停止了对ASP版本的更新。但是由于有很多人仍然习惯使用ASP来开发网站,所以,再次我将以一个简单的例子来说明在ASP中如何使用Cache。

简单的说使用Cache基本原理是,把经常需要且获得代价昂贵的数据在内存中持续保存一定时间,以供这些数据可以被直接地全局地访问。例如,有一些数据需要从数据库多个表中查询获得,且几乎每个页面都要调用这些数据。这种情况下的最佳实现就是将这部分数据Cache起来,在ASP中的简单实现就是将这些数据的最终表达形式(例如HTML流)封装在string中然后存入ASP内置对象Application中(本文主要讨论的是动态Cache,简单的ASP 应用就省略)。这样做的好处是,在整个网站中可以全局调用这段HTML,而且Application是存在内存中,所以不用再去查询数据库,从而加快了响应时间并节省了服务器负荷。当然这是以消耗内存为代价的,是一个典型的以空间换时间的实例。

使用这种方法虽然有很多好处,但是再遇到频繁变化的数据源(数据库)的时候,这种方法就可能不再适用,因为ASP Application对象有一个缺点,就是不能自动随数据源的变化而变化,或者控制刷新间隔。所以就需要开发人员编程来实现动态Cache。当然在程序设计的时候可以在所有进行改变数据源(数据库)操作时,就更新一次Appliction。从而使数据源(数据库)始终保持一致。这样做在编程上要考虑的问题会比较多,容易遗漏细节。所以除了特定情况我不推荐使用这种方法。

我认为在ASP中最好的办法是用编程实现定时刷新Cache,也就是说给Application中储存的设一个过期时间。当然,在ASP中Application对象没有这样一个ExpireTime属性。这需要用程序实现。如本文的第一个示例。
walkthrough

准备工作:检查IIS是否安装且可用,检查SQL Server 2000是否安装且有默认的演示数据库NorthWind。
在IIS中建立虚拟目录,并注意权限设置,允许Internet 匿名用户IUSR_MACHINENAME访问。
检查SQL Server 2000 NorthWind 数据库的权限设置,允许Internet 匿名用户IUSR_MACHINENAME对categories表有读权限。
在建立虚拟目录的地方创建三个空白的演示文件:default.asp;getcache.asp;conn.asp。default.asp为前台展示页面,getcache.asp为后台控制Cache的文件,conn.asp是保存连接字符串的文件。
将后文所示代码复制到这三个文件上即可。
在IIS里浏览default.asp,察看时候顺利加载select控件。在刷新几次即可看出效果。在30秒之内不会在从数据库中读取而是从Application读取数据。从执行效果过来看,第一次的刷新速度明显慢于后面的刷新速度。如果有条件可以用SQL Server 2000自带的监视数据库的工具“事件探察器”监视就会发现只在第一次执行页面的时候执行SQL查询。

使用这种方法的基本原理是,首先定义一个Cache变量(同样是储存在Application对象中)储存上一次和数据源同步的时间。在每一次新的刷新中判断当前时间与Cache中存的时间的间隔是否大于预先设定好的过期时间,若Cache未过期则直接从Cache读取HTML流,若Cache过期则重新读取数据源并重新在Cache写入同步时间,从而使Cache与数据源保持同步。

这种方法的使用很普及,但是并没有做到真正的即时同步。因为在ASP中数据源的变化很难或几乎不可能通知到ASP本身。这也是ASP方案和J2EE方案比较很略劣势的一方面。在Microsoft新一代建构.NET上却很好的实现了这种即时同步。下面的内容将重点介绍在ASP.NET中如何实现这种技术。
ASP.NET中Cache动态使用

我在使用ASP.NET的过程中发现在.NET Framework中有Cache对象用于专门管理的储存各种数据对象。这对以前在ASP中使用Application储存Cache的开发人员来说无疑是一大福音。Cache对象提供了很多优秀的特性,例如设置访问优先级策略,设置过期时间,在Cache过期时触发事件,自由管理Cache中的每一条记录等优点。但是本文我要重点讲述如何实现基于数据源改变事件触发Cache动态刷新的技巧。首先向讲述一下Cache.Add Method。
Cache.Add Method Reference

详情请见MSDN中Cache.Add Method。我再稍作一些解释





Add(



string key,



object value,



CacheDependency dependencies,



DateTime absoluteExpiration,



TimeSpan slidingExpiration,



CacheItemPriority priority,



CacheItemRemoved CallbackonRemoveCallback



);





1

0 0