1、什么是ASP缓存/为何要缓存html
其实当你的web站点采用asp技术创建的初期,可能会感受到的是asp动态网页技术带来的便利性,以及随意修改性、自如的http控制。但随着访问量的增长,你必定会发现本身的站点访问速度会愈来愈慢,IIS从新启动得愈来愈频繁。那么,你必定想怎么优化你的asp程序,诸如更换性能更优异的数据库、创建索引、编写存储过程等等。这些措施有些不须要增长成本压力,有些则成本压力很大(譬如丛access到SQL),并且效果还不必定。web
面对web访问压力,我认为最经济的办法是利用缓存优化技术来实现缓解web的服务压力。数据库
Web访问量增长一般意味着如下资源需求的快速增加:编程
一、网卡流量增长,须要消耗更多的CPU处理网络流量和网络I/O线程。浏览器
二、须要更频繁的打开/关闭数据库连结(若是使用数据库技术—一般asp都会采用数据库做为数据存储),严重消耗资源的事物数量、以及事务相互竞争资源引发的死锁、会增长网络I/O或者CPU消耗。缓存
三、若是采用session的话,IIS为了维持状态,会消耗更多内存,而内存消耗可能会引起物理内存不够,引发物理内存同辅存间的频繁交换,从而引发代码执行的停顿,web响应阻滞。服务器
四、因为访问的不到及时响应,会引发网页访问故障,致使用户刷新,从而加重CPU、内存等资源需求。网络
实际上,考虑一般的web应用程序,不少时候的动态代码执行是没必要要的。 session
2、asp缓存的分类app
擅自总结,asp的缓存能够分为两类:
一、文件缓存
所谓文件缓存,就是根据逻辑判断,一段时间内某个asp的特定执行将不会有很大的变更,于是将内容以静态html的形式存放,而后以web的重定向技术让客户端访问静态文件,以达到减小CPU、数据库资源等的需求。这样的应用不少,譬如不少论坛就是在回复贴子的时候将整个贴子从新生成一个静态文件,而后进行重定向的,例如 donews.com的论坛。该成静态还有一个反作用(好处)--能够很容易被google等搜索引擎收录。一些所谓新闻发布系统的都采用了此技术。
二、文件片段缓存
所谓文件缓存,也是基于逻辑判断,某部分数据(一般是须要消耗资源的大容量数据库查询取得)在必定时间内不会改变,因此咱们能够将这些数据利用文件的形式进行存储,当须要时候,能够经过读取文件来获取数据,避免增长数据库的负担。例如,咱们一般将一些数据以xml格式存储,而后利用xslt技术实现显示(xml处理一般须要大量CPU资源,因此一般是IE直接读取xml到客户端在客户的CPU上进行处理)。CSDN的论坛就是这样处理的。
三、主存缓存
除此以外,还能够考虑在内存中处理缓存,将须要及时响应的内容存储在内存中,一旦访问需求,当即从快速的贮存中输送出去。若是极大量的访问需求集中在几个少许的页面或者主存足够多,我想采用主存缓存必定能够大幅度提升web访问性能。
3、如何实现/使用缓存
实现缓存须要考虑如下问题:
一、哪些页面会在短期内不会改变?
分析本身的站点,这样的页面不少。譬如一个站点一般都有新闻资讯类的栏目,这些栏目一般都是站点维护人员在一天的某个时间发布资料,以后不多改动页面。那么这些页面就适合于采用静态文件缓存。实际上,所谓新闻发布系统就是这么作的,那么那也能够参考这些系统的思想改造本身的原有动态asp页面。
二、那些页面针对所有访问者都采用同一个逻辑生成(也就是不区分访问者)。
除了新闻资讯之类的栏目全部访问者都看一个界面外,论坛等消耗资源的应用通常也能够设计成统一逻辑生成(同一个贴子,张三李四看的都同样),针对这类应用页面咱们也能够采用静态缓存来实现。也能够考虑将数据片段化,利用脚本技术在服务器处理能力以外也就是客户端浏览器进行处理。
三、采用缓存的代价和收获。
主要就是“空间换(响应)时间”。利用缓存技术将以后频繁须要的内容进行预处理,使之提升web服务器响应能力,更重要赢得访问者的欢心。
代价就是web空间需求增长,同时又可能影响到访问效果。
但我认为适当的缓存,是利大于弊的。
四、那些地方不适宜采用缓存
动态查询页面,每一个人的查询内容不同,因此显示结果不大同样,因此不大可能将查询结果生成缓存,因此采用缓存较为复杂且缓存利用率底下,形成管理成本上什(假设你缓存了1000个查询关键字,那么管理这些关键字同缓存的对应也是麻烦事)。
4、实例分析
假设一个建议论坛的原有布局以下:
根目录下:
default.asp首页,通常是精华、推荐之类
listBorad.asp 该文件列出所有分栏目的名称和介绍,若是携带参数MainBID就表示要列出板块下的栏目
listThread.asp该文件若是不携带任何参数表示列出所有的贴子,携带MainBID表示列出某块的所有贴子。若是携带subBID表示列出具体栏目的贴子。若是携带page参数表示分页列出主题。
ViewThread.asp 列出某个贴子内容。咱们假设贴子显示为一个发言,任意跟贴所有列在后面。ID参数为要显示的贴子。
Reply.asp 回应某个贴子,携带参数Id回应某个贴子
其它的暂不讨论。
以上,咱们能够看到,若是所有是采用原始的ASP/PHP来作,那几乎每个asp文件的执行都须要数据库操做,频繁的查询,多表查询。要知道查询数据库最终会带来性能的降低,响应速度降低,带给访问者缓慢的浏览影响,不利于web的质量。更重要的是对于甲乙两我的来将,他们访问ViewThread.asp之类的若是ID一致,那么不少时候他们会看到一样的内容(他们的浏览器收到的HTML代码几乎同样),可是为了这“一样的内容”,服务器须要打开数据库连结、查询,读取纪录,显示,关闭纪录、数据库连结。。。。如下列的消耗服务器资源的操做,若是是更多的人来访问,最终的结果是这些人加重消耗服务器资源。实际上,这些为了“一样的内容”所作的重复劳动是能够利用缓存技术进行优化避免的。譬如:
在reply.asp提交内容后,咱们当即调用生成静态的功能,将整个贴子内容存储为viewThread_xxxx.htm之类的静态html文件,再一般状况下访问viewThread.asp?ID=xxxx的时候,系统自动redirect到对应的静态文件viewThreadxxxx.htm去。这样,当一个贴子没有最新发布时候,他始终是静态内容提供给浏览者;一旦有了新的提交,将会更新到静态文件中去,这样,将会节省不少次数据库操做,大大提升响应速度。
listBorad.asp也能够实施静态化。咱们能够分析其可能携带的参数,将缓存文件名设定为listBoard_xx.htm,在增长新的栏目时候进行更新listBoard_xxx.htm。listThread.asp也相似,只不过因为其参数更多,因此缓存文件也会不少。击若要缓存listThread.asp? subBID=xxx&page=2,那么对应的静态文件是listThread_xxx_p2.htm。default.asp也同样。
那么如何判断何时更新?在什么时机更新?
讨论listThread.asp? subBID=xxx&page=2,咱们在执行listThread.asp俄时候提取subID和page,而后探测listThread_xxx_p2.htm是否存在,若是不存在就调用静态生成功能进行生成该文件,最终重定向到此静态文件。注意,此处的不存在就意味着出现了新的内容须要咱们进行更新。
那如何形成文件不存在呢?删除。咱们在发表一个新的贴子、删除贴子、移动贴子的时候咱们能够将相似listThread_xxx_p2.htm之类的静态文件所有删除。这样就通知了什么时候要进行缓存。
如今还剩下一个问题,如何生成静态文件?
咱们注意到,以前咱们提到的“一样的内容”。咱们能够将改造前的default.asp、listThread.asp等拷贝一个副本,取名为default_d.asp、listThread_2.asp,且在同一个目录中(理论上listThtrad.asp?subID=123同LISTtHREAD_D.ASP?SUBID=123的访问结果会是一样的内容),这样咱们在须要生成静态文件的逻辑中,经过WEB访问请求的方式调用改造前的副本,获得html代码,并存储为静态文件。这个web请求实际上至关于在任何真实浏览者访问静态内容以前,由服务器自身现察看将会输出的html,而后返回这些代码,利用文件操做功能存储为静态文件。这样,缓存文件就在真正浏览者以前被建立。
这样的方案几乎不触动原来的布局,几乎不会形成由于改造出现404之类的错误。其次,静态文件也会帮助你的站点容易被被google之类的搜索引擎收录。何乐而不为?
最后,提醒,经过web访问,asp编程环境下,不少人采用xmlHTTP组件访问,这会形成不少问题。xmlhttp自身会cache请求的资源,致使咱们经过此组件请求获得的内容不是最新的,形成逻辑上的混乱。因此,应当选择xml Server http对象或者winhttp组件来实现web请求资源。
80摘后语:实现缓存技术主要有几种关键的东西,
服务器端application,适用于多个页面间存在较多不太常常更新的元素;
生成HTML静态文件,一般会采用模版技术,经过FSO或ADOStream生成静态文件,一般都适用于不少人看到的都是一样的页面内容的状况,如文章、论坛帖子等;
其余
其实最重要的仍是根据本身系统的需求来决定采用何种技术,尽可能少地减小查询数据库的次数,减轻数据库压力,固然,通常会以牺牲空间作代价。
另外,正在考虑是否可以采用客户端的缓存来提升效率?