ASP使用缓存方法及缓存类详解.docx

上传人:b****6 文档编号:4770627 上传时间:2022-12-08 格式:DOCX 页数:11 大小:22.76KB
下载 相关 举报
ASP使用缓存方法及缓存类详解.docx_第1页
第1页 / 共11页
ASP使用缓存方法及缓存类详解.docx_第2页
第2页 / 共11页
ASP使用缓存方法及缓存类详解.docx_第3页
第3页 / 共11页
ASP使用缓存方法及缓存类详解.docx_第4页
第4页 / 共11页
ASP使用缓存方法及缓存类详解.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

ASP使用缓存方法及缓存类详解.docx

《ASP使用缓存方法及缓存类详解.docx》由会员分享,可在线阅读,更多相关《ASP使用缓存方法及缓存类详解.docx(11页珍藏版)》请在冰豆网上搜索。

ASP使用缓存方法及缓存类详解.docx

ASP使用缓存方法及缓存类详解

一、何谓ASP缓存/为什么要缓存

当你的web站点采用asp技术建立的初期,可能感觉到的是asp动态网页技术带来

的便利性,以及随意修改性、自如的http控制。

但是,随着访问量的增加,你一

定会发现自己的站点访问速度越来越慢,IIS重新启动得越来越频繁。

接下来,

你一定想优化asp,诸如更换性能更优异的数据库、建立索引、编写存储过程等

等。

这些措施有些不需要增加成本压力,有些则成本压力很大(譬如丛access到

SQL),而且效果还不一定。

面对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、数据库资源等的需求。

这样的应用很多,譬

如很多论坛就是在回复贴子的时候将整个贴子重新生成一个静态文件,然后进行

重定向的,例如的论坛。

该成静态还有一个副作用(好处)--可以

很容易被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.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请求的资源,导致我们通过此组件请求得

到的内容不是最新的,造成逻辑上的混乱。

所以,应当选择xmlServerhttp对

象或者winhttp组件来实现web请求资源。

使用ASP中的缓存技术可以很大程度上提高你的网站性能,其实这些实现方法是

非常的简单,它将说明如何在服务器上的缓存是如何工作以及你如何使用一种被

称为断开连接的ADO连接技术。

在介绍这些技术之前先说明一下到底什么是ASP的缓存技术?

所谓缓存其实就是在内存中开辟一个用来保存数据的空间,使用缓存你就不用频

繁的访问你保存在硬盘上的数据了,灵活的使用缓存你就免去了心疼的看着可怜

的硬盘饱受读数据时的折磨了。

当你一旦执行了一个查询动作,并且将查询结果

放入缓存中后,你就可以很迅速的重复访问这些数据了。

而如果你不把数据放入

缓存的话,当你再次执行这个查询时,服务器会将进程耗费在从数据库中获取并

排序上了。

当数据保存在缓存中时,再次查询时耗费的时间主要是在显示数据的时间上了。

也就是说,我们不应该把经常需要改变的数据放到服务端的缓存中,我们应该把

改变少,但是又需要经常访问的数据放到缓存中。

现在我们先讨论ASP在服务端使用缓存的技术,过会再讨论ASP如何在客户端使用

缓存的技术。

当你有大量的数据(静态的,就是说变动比较少的)需要显示给客户端时,你就

可以考虑使用服务端的缓存技术了。

这种技术尤其适用于那些显示风格一致性比

较强的网站(呵呵,对于非主流的网站可不好用的说。

其实实现方法特别的简单,大家只要看看下面这个简单的例子就明白了。

这是一个用来显示书籍分类的例子程序

DisplayBooks.ASP文件:

<%@LANGUAGE=JavaScript%>

书籍分类;<%=getBooksListBox()%>

<%

functiongetBooksListBox()

{

BooksListBox=Application("BooksListBox")

if(BooksListBox!

=null)returnBooksListBox;

crlf=String.fromCharCode(13,10)

BooksListBox=""+crlf;

SQL="Select*FROMBooksorDERBYName";

cnnBooks=Server.CreateObject("ADODB.Connection");

cnnBooks.Open("Books","Admin","");

rstBooks=cnnBooks.Execute(SQL);

fldBookName=rstBooks("BookName");

while(!

rstBooks.EOF){

BooksListBox=BooksListBox+"

fldBookName+""+crlf;

rstBooks.MoveNext();

}

BooksListBox=BooksListBox+""

Application("BooksListBox")=BooksListBox

returnBooksListBox;

}

%>

很简单把,其实就是用了很简单的Application技术,而且就一句话的不同:

  

Application("BooksListBox")=BooksListBox

  你可以验证一下你就会发现服务器上的请求数量会降低不少的。

这种情况尤

其适合与那些更新不是很频繁的网站内容,例如你一天(或则很长时间)只更新

一次。

  下面再讨论一种客户端的缓存技术这种技术也叫断开连接的ADO连接技术(

翻译水平太次,听上去怎么这么别扭)。

这种技术主要使用在用来保存用户个人

信息,例如用户的密码,代号等等上面。

它主要使用了ADO的一些属性。

同时也

回答了一些网友曾经提到过的能否在Applocation中使用ADO对象的问题。

解释不

清楚,下面让代码来发言:

文件GLOBAL.ASA:

--METADATATYPE="TypeLib"FILE="C:

\ProgramFiles\Common

Files\system\ado\msado15.dll"-->

SubApplication_OnStart

SQL="SelectUserName,PasswordFROMUserInfo"

cnnUsers="DSN=User"

SetrsUsers=Server.CreateObject("ADODB.Recordset")

'注意下面这两句话,就是用来实现那个叫可用的断开连接的ADO技术

rsCustomers.CursorLocation=adUseClient

rsCustomers.OpenSQL,cnnAdvWorks,adOpenStatic,AdLockReadOnly

'断开RecordSet的和数据库的连接

rsCustomers.ActiveConnection=Nothing

SetApplication("rsCustomers")=rsCustomers

EndSub

文件Users.ASP

<%

'Clone方法使得每个用户拥有自己的一个RecordSet集合

SetyourUsers=Application("rsUsers").Clone

SetUserName=yourUsers("UserName")

SetPassword=yourUsers("Password")

DoUntilyourUsers.EOF

%>

用户姓名:

<%=UserName%>用户密码:

<%=Password%>

<%

yourUsers.MoveNext

Loop

%> 

至于缓存的作用,我想我也不用再多说了,它的作用已经很明显,特别是对于信

息量非常大或是全数据库页面的网站,他能很好地利用主机的内存资源,加速

ASP的执行效率,减轻服务器的负担,而动网在这一方面做得是最突出的,像他

现在的dvbbs7.1.0版,更是在缓存的利用上更上一层楼,前后台大多的操作都和

缓存有关,而现在动网里用的也就是迷城浪子的缓存类:

<%

ClassCls_Cache

'==================使用说明====================

'本类模块是动网先锋原创,作者:

迷城浪子。

如采用本类模块,请不要去掉这

个说明。

这段注释不会影响执行的速度。

'作用:

缓存和缓存管理类

'公有变量:

Reloadtime过期时间(单位为分钟)缺省值为14400

'MaxCount缓存对象的最大值,超过则自动删除使用次数少的对象。

缺省值为

300

'CacheName缓存组的总名称,缺省值为"Dvbbs",如果一个站点中有超过一个缓

存组,则需要外部改变这个值。

'属性:

Name定义缓存对象名称,只写属性。

'属性:

value读取和写入缓存数据。

'函数:

ObjIsEmpty()判断当前缓存是否过期。

'方法:

DelCahe(MyCaheName)手工删除一个缓存对象,参数是缓存对象的名称。

'========================

PublicReloadtime,MaxCount,CacheName

PrivateLocalCacheName,CacheData,DelCount

PrivateSubClass_Initialize()

Reloadtime=14400'过期时间(单位为分钟)

CacheName="Dvbbs"'缓存组的总名称

EndSub

PrivateSubSetCache(SetName,NewValue)

Application.Lock

Application(SetName)=NewValue

Application.unLock

EndSub

PublicPropertyLetName(ByValvNewValue)'缓存对象名称

LocalCacheName=LCase(vNewValue)

EndProperty

PublicPropertyLetValue(ByValvNewValue)'读取和写入缓存数据

IfLocalCacheName<>""Then

CacheData=Application(CacheName&"_"&LocalCacheName)

IfIsArray(CacheData)Then

CacheData(0)=vNewValue

CacheData

(1)=Now()

Else

ReDimCacheData

(2)

CacheData(0)=vNewValue

CacheData

(1)=Now()

EndIf

SetCacheCacheName&"_"&LocalCacheName,CacheData

Else

Err.RaisevbObjectError+1,"DvbbsCacheServer","pleasechangethe

CacheName."

EndIf

EndProperty

PublicPropertyGetValue()

IfLocalCacheName<>""Then

CacheData=Application(CacheName&"_"&LocalCacheName)

IfIsArray(CacheData)Then

Value=CacheData(0)

Else

Err.RaisevbObjectError+1,"DvbbsCacheServer","TheCacheDataIs

Empty."

EndIf

Else

Err.RaisevbObjectError+1,"DvbbsCacheServer","pleasechangethe

CacheName."

EndIf

EndProperty

PublicFunctionObjIsEmpty()'判断当前缓存是否过期

ObjIsEmpty=True

CacheData=Application(CacheName&"_"&LocalCacheName)

IfNotIsArray(CacheData)ThenExitFunction

IfNotIsDate(CacheData

(1))ThenExitFunction

IfDateDiff("s",CDate(CacheData

(1)),Now())<60*ReloadtimeThen

ObjIsEmpty=False

EndFunction

PrivateSubmakeEmpty(SetName)'释放内存

Application.Lock

Application(SetName)=Empty

Application.unLock

EndSub

PublicSubDelCahe(MyCaheName)'删除缓存

makeEmpty(CacheName&"_"&MyCaheName)

EndSub

EndClass

SetWydCache=NewCls_Cache

WydCache.Reloadtime=0.5'定义过期时间(以分钟为单会)

WydCache.CacheName="pages" '定义缓存名

WydCache.Name="MyCacheName"'定义缓存对象名

IFWydCache.ObjIsEmpty()Then''判断是否可用(包括过期,与是否为空值)

..................

BoardJumpList=xxx

WydCache.Value=BoardJumpList'写入内容

Response.writeBoardJumpList

Else

Response.writeWydCache.Value

Endif

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1