asp/php缓存提高web性能

转载 2007年10月14日 22:26:00
何谓ASP缓存/为什么要缓存

当你的web站点采用asp技术建立的初期,可能感觉到的是asp动态网页技术带来的便利性,以及随意修改性、自如的http控制。但是,随着访问量的增加,你一定会发现自己的站点访问速度越来越慢,IIS重新启动得越来越频繁。接下来,你一定想优化asp,诸如更换性能更优异的数据库、建立索引、编写存储过程等等。这些措施有些不需要增加成本压力,有些则成本压力很大(譬如丛accessSQL),而且效果还不一定。

面对web访问压力,我认为最经济的办法是利用缓存优化技术来实现缓解web的服务压力。

Web访问量增加通常意味着以下资源需求的快速增长:

1、  网卡流量增加,需要消耗更多的CPU处理网络流量和网络I/O线程。

2、  需要更频繁的打开/关闭数据库连结(如果使用数据库技术通常asp都会采用数据库作为数据存储),严重消耗资源的事物数量、以及事务相互竞争资源引起的死锁、会增加网络I/O或者CPU消耗。

3、  如果采用session的话,IIS为了维持状态,会消耗更多内存,而内存消耗可能会引发物理内存不够,引起物理内存同辅存间的频繁交换,从而引起代码执行的停顿,web响应阻滞。

4、  由于访问的不到及时响应,会引起网页访问故障,导致用户刷新,从而加剧CPU、内存等资源需求。

实际上,考虑通常的web应用程序,很多时候的动态代码执行是不必要的。

 

 

二、asp缓存的分类

擅自总结,asp的缓存可以分为两类:

1、  文件缓存

所谓文件缓存,就是根据逻辑判断,一段时间内某个asp的特定执行将不会有很大的变动,因而将内容以静态html的形式存放,然后以web的重定向技术让客户端访问静态文件,以达到减少CPU、数据库资源等的需求。这样的应用很多,譬如很多论坛就是在回复贴子的时候将整个贴子重新生成一个静态文件,然后进行重定向的,例如 donews.com的论坛。该成静态还有一个副作用(好处)--可以很容易被google等搜索引擎收录。一些所谓新闻发布系统的都采用了此技术。

2、  文件片断缓存

所谓文件缓存,也是基于逻辑判断,某部分数据(通常是需要消耗资源的大容量数据库查询取得)在一定时间内不会改变,所以我们可以将这些数据利用文件的形式进行存储,当需要时候,可以通过读取文件来获取数据,避免增加数据库的负担。例如,我们通常将一些数据以xml格式存储,然后利用xslt技术实现显示(xml处理通常需要大量CPU资源,所以通常是IE直接读取xml到客户端在客户的CPU上进行处理)。CSDN的论坛就是这样处理的。

3、  主存缓存

除此之外,还可以考虑在内存中处理缓存,将需要及时响应的内容存储在内存中,一旦访问需求,立即从快速的贮存中输送出去。如果极大量的访问需求集中在几个少量的页面或者主存足够多,我想采用主存缓存一定可以大幅度提高web访问性能。

 

 

三、如何实现/使用缓存

       实现缓存需要考虑以下问题:

1、  哪些页面会在短时间内不会改变?

分析自己的站点,这样的页面很多。譬如一个站点通常都有新闻资讯类的栏目,这些栏目通常都是站点维护人员在一天的某个时间发布资料,之后很少改动页面。那么这些页面就适合于采用静态文件缓存。实际上,所谓新闻发布系统就是这么做的,那么那也可以参考这些系统的思想改造自己的原有动态asp页面。

 

 

2、  那些页面针对全部访问者都采用同一个逻辑生成(也就是不区分访问者)。

除了新闻资讯之类的栏目所有访问者都看一个界面外,论坛等消耗资源的应用一般也可以设计成统一逻辑生成(同一个贴子,张三李四看的都一样),针对这类应用页面我们也可以采用静态缓存来实现。也可以考虑将数据片断化,利用脚本技术在服务器处理能力之外也就是客户端浏览器进行处理。

 

 

3、  采用缓存的代价和收获。

主要就是“空间换(响应)时间”。利用缓存技术将之后频繁需要的内容进行预处理,使之提高web服务器响应能力,更重要赢得访问者的欢心。

代价就是web空间需求增加,同时又可能影响到访问效果。

但我认为适当的缓存,是利大于弊的。

 

 

4、  那些地方不适宜采用缓存

动态查询页面,每个人的查询内容不一样,所以显示结果不大一样,所以不大可能将查询结果生成缓存,所以采用缓存较为复杂且缓存利用率底下,造成管理成本上什(假设你缓存了1000个查询关键字,那么管理这些关键字同缓存的对应也是麻烦事)。

 

 

四、实例分析

       假设一个建议论坛的原有布局如下:

       根目录下:

              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.htmlistThread.asp也类似,只不过由于其参数更多,所以缓存文件也会很多。击若要缓存listThread.asp? subBID=xxx&page=2,那么对应的静态文件是listThread_xxx_p2.htmdefault.asp也一样。

       那么如何判断什么时候更新?在什么时机更新?

       讨论listThread.asp? subBID=xxx&page=2,我们在执行listThread.asp俄时候提取subIDpage,然后探测listThread_xxx_p2.htm是否存在,如果不存在就调用静态生成功能进行生成该文件,最终重定向到此静态文件。注意,此处的不存在就意味着出现了新的内容需要我们进行更新。

那如何造成文件不存在呢?删除。我们在发表一个新的贴子、删除贴子、移动贴子的时候我们可以将类似listThread_xxx_p2.htm之类的静态文件全部删除。这样就通知了何时要进行缓存。

       现在还剩下一个问题,如何生成静态文件?

       我们注意到,之前我们提到的“同样的内容”。我们可以将改造前的default.asplistThread.asp等拷贝一个副本,取名为default_d.asplistThread_2.asp,且在同一个目录中(理论上listThtrad.asp?subID=123LISTtHREAD_D.ASP?SUBID=123的访问结果会是同样的内容),这样我们在需要生成静态文件的逻辑中,通过WEB访问请求的方式调用改造前的副本,得到html代码,并存储为静态文件。这个web请求实际上相当于在任何真实浏览者访问静态内容之前,由服务器自身现察看将会输出的html,然后返回这些代码,利用文件操作功能存储为静态文件。这样,缓存文件就在真正浏览者之前被创建。

       这样的方案几乎不触动原来的布局,几乎不会造成因为改造出现404之类的错误。其次,静态文件也会帮助你的站点容易被被google之类的搜索引擎收录。何乐而不为?

最后,提醒,通过web访问,asp编程环境下,很多人采用xmlHTTP组件访问,这会造成很多问题。xmlhttp自身会cache请求的资源,导致我们通过此组件请求得到的内容不是最新的,造成逻辑上的混乱。所以,应当选择xml Server http对象或者winhttp组件来实现web请求资源。 

 

 

 

 

 

 

php大型网站如何提高性能和并发访问

 一、大型网站性能提高策略:     大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还...
  • u011690564
  • u011690564
  • 2017年02月06日 10:36
  • 569

前端优化:九个技巧,提高Web性能

当今数字世界,存在着无数的网站,每天都需要处理各种不同的原因的访问。然而,这些网站中有很大一部分显得笨重,使用起来也很麻烦。没怎么优化的网站会被各种各样的问题困扰,包括加载时间、不支持移动设备、浏览器...
  • VermouthDream
  • VermouthDream
  • 2017年02月11日 21:37
  • 1503

提高PHP整体性能会用到的技术

我一直认为PHP的运行速度是非常的理想的,尤其是Zend引擎的加速之后。但是PHP仍然有加速的可能,你知道吗? 所有的一切都始于如何优化PHP的编译 尝试使用针对CPU型号的特殊编...
  • lifushan123
  • lifushan123
  • 2015年04月20日 15:46
  • 528

php-web开发中的缓存

开发中的缓存缓存的作用:减少内存,cpu资源的消耗缓存中需要关注的问题:1 缓存命中率 2 缓存的更新策略 3 缓存单条数据的最大值 4 缓存总量的大小 客户端缓存,http协议中使用缓存HTML M...
  • cabing2005
  • cabing2005
  • 2016年12月14日 17:03
  • 521

优化php效率,提高php性能的一些方法

优化php效率,提高php性能的一些方法
  • qq_29955091
  • qq_29955091
  • 2016年07月21日 16:35
  • 2616

【设计优化】-使用缓存(Cache)提高程序性能

缓存(Cache)就是一块用来存放数据的内存空间。主要作用是暂存数据处理结果,并提供下次访问使用。 缓存的使用非常普遍,比如,浏览器都会在本地缓存页面,从而减少HTTP 的访问次数。又...
  • zq602316498
  • zq602316498
  • 2014年09月06日 17:50
  • 1995

java反射如何提升性能

java应用反射的时候,性能往往是java程序员担心的地方,那么在大量运用反射的时候,性能的微弱提升,对这个系统而言都是如旱地逢甘霖。 下面用代码简单验证一下反射性能都损耗在哪里。 pack...
  • w172087242
  • w172087242
  • 2016年06月12日 20:30
  • 2476

《java系统性能调优》--2.缓存

上一节,简单介绍了如何发现性能瓶颈。从这节开始,我会和大家分享我在项目中做的一些性能调优工作。这个系列没有什么顺序可言,觉得什么重要,就说说什么。 这节,我们聊缓存。 最开始接触缓存这个词,是学习...
  • shan9liang
  • shan9liang
  • 2014年06月06日 11:57
  • 2621

IO系统性能之二:缓存和RAID如何提高磁盘IO性能

O系统性能之二:缓存和RAID如何提高磁盘IO性能 马齿苋 发表评论阅读评论6,851 次查看 高速缓存(Cache)RAID(Redundant Array Of Inexpe...
  • haiross
  • haiross
  • 2014年07月10日 16:03
  • 4013

先锋缓存类(极度加速ASP和提高执行效率)

clsCache 公共属性  引用内容:  valid   返回是否有效。true表示有效,false表示无效。只读。   Version  获取类的版本信息。只读。...
  • lishimin1012
  • lishimin1012
  • 2015年12月31日 11:24
  • 868
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:asp/php缓存提高web性能
举报原因:
原因补充:

(最多只允许输入30个字)