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、数据库资源等的需求。这样的应用很多,譬如很多论坛就是在回复贴子的时候将整个贴子重新生成一个静态文件,然后进行重定向的,例如 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.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请求资源。
使用ASP中的缓存技术可以很大程度上提高你的网站性能,其实这些实现方法是非常的简单,它将说明如何在服务器上的缓存是如何工作以及你如何使用一种被称为断开连接的ADO连接技术。

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

  所谓缓存其实就是在内存中开辟一个用来保存数据的空间,使用缓存你就不用频繁的访问你保存在硬盘上的数据了,灵活的使用缓存你就免去了心疼的看着可怜的硬盘饱受读数据时的折磨了。当你一旦执行了一个查询动作,并且将查询结果放入缓存中后,你就可以很迅速的重复访问这些数据了。而如果你不把数据放入缓存的话,当你再次执行这个查询时,服务器会将进程耗费在从数据库中获取并排序上了。

  当数据保存在缓存中时,再次查询时耗费的时间主要是在显示数据的时间上了。
也就是说,我们不应该把经常需要改变的数据放到服务端的缓存中,我们应该把改变少,但是又需要经常访问的数据放到缓存中。

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

  当你有大量的数据(静态的,就是说变动比较少的)需要显示给客户端时,你就可以考虑使用服务端的缓存技术了。这种技术尤其适用于那些显示风格一致性比较强的网站(呵呵,对于非主流的网站可不好用的说。)

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

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

DisplayBooks.ASP文件:

代码如下:

< %@ LANGUAGE=JavaScript % >   
< html >   
< body >   
< form method=post >   
书籍分类; < %= getBooksListBox() % >   
< p>   
< input type=submit >   
 
< %   
function getBooksListBox()   
{   
BooksListBox = Application("BooksListBox")   
if (BooksListBox != null) return BooksListBox;   
crlf = String.fromCharCode(13, 10)   
BooksListBox = "< select name=Books>" + crlf;   
SQL = "Select * FROM Books orDER BY Name";   
cnnBooks = Server.CreateObject("ADODB.Connection");   
cnnBooks.Open("Books", "Admin","");   
rstBooks = cnnBooks.Execute(SQL);   
fldBookName = rstBooks("BookName");   
while (!rstBooks.EOF){   
BooksListBox = BooksListBox + " < option>" +   
fldBookName + "" + crlf;   
rstBooks.MoveNext();   
}   
BooksListBox = BooksListBox + ""   
Application("BooksListBox") = BooksListBox   
return BooksListBox;   
}   
% >

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

代码如下:

Application("BooksListBox") = BooksListBox

你可以验证一下你就会发现服务器上的请求数量会降低不少的。这种情况尤其适合与那些更新不是很频繁的网站内容,例如你一天(或则很长时间)只更新一次。

  下面再讨论一种客户端的缓存技术这种技术也叫断开连接的ADO连接技术(翻译水平太次,听上去怎么这么别扭)。这种技术主要使用在用来保存用户个人信息,例如用户的密码,代号等等上面。它主要使用了ADO的一些属性。同时也回答了一些网友曾经提到过的能否在Application中使用ADO对象的问题。解释不清楚,下面让代码来发言:
文件GLOBAL.ASA:

代码如下:

<!--METADATA TYPE="TypeLib" FILE="C:\Program Files\Common  
Files\system\ado\msado15.dll"-- >   
< SCRIPT LANGUAGE=VBScript RUNAT="Server" >   
Sub Application_OnStart   
SQL = "Select UserName, Password FROM UserInfo"   
cnnUsers = "DSN=User"   
Set rsUsers = Server.CreateObject("ADODB.Recordset")   
'注意下面这两句话,就是用来实现那个叫可用的断开连接的ADO技术   
rsCustomers.CursorLocation = adUseClient   
rsCustomers.Open SQL, cnnAdvWorks, adOpenStatic, AdLockReadOnly   
' 断开RecordSet的和数据库的连接   
rsCustomers.ActiveConnection = Nothing   
Set Application("rsCustomers") = rsCustomers   
End Sub

文件Users.ASP

代码如下:

< %   
'Clone方法使得每个用户拥有自己的一个RecordSet集合   
Set yourUsers = Application("rsUsers").Clone   
Set UserName = yourUsers("UserName")   
Set Password = yourUsers("Password")   
Do Until yourUsers.EOF   
% >   
 
用户姓名:< %= UserName % > 用户密码:< %= Password % >
 
< %   
yourUsers.MoveNext   
Loop   
% >

于缓存的作用,我想我也不用再多说了,它的作用已经很明显,特别是对于信息量非常大或是全数据库页面的网站,他能很好地利用主机的内存资源,加速ASP的执行效率,减轻服务器的负担,而动网在这一方面做得是最突出的,像他现在的dvbbs7.1.0版,更是在缓存的利用上更上一层楼,前后台大多的操作都和缓存有关,而现在动网里用的也就是迷城浪子的缓存类:

代码如下:

< %   
Class Cls_Cache   
'==================使用说明====================   
'本类模块是动网先锋原创,作者:迷城浪子。如采用本类模块,请不要去掉这个说明。
'公有变量:Reloadtime 过期时间(单位为分钟)缺省值为14400   
'MaxCount 缓存对象的最大值,超过则自动删除使用次数少的对象。缺省值为300   
'CacheName 缓存组的总名称,缺省值为"Dvbbs",如果一个站点中有超过一个缓存组,则需要外部改变这个值。   
'属性:Name 定义缓存对象名称,只写属性。   
'属性:value 读取和写入缓存数据。   
'函数:ObjIsEmpty()判断当前缓存是否过期。   
' 方法:DelCahe(MyCaheName)手工删除一个缓存对象,参数是缓存对象的名称。   
'========================   
Public Reloadtime,MaxCount,CacheName   
Private LocalCacheName,CacheData,DelCount   
 
Private Sub Class_Initialize()   
Reloadtime=14400 '过期时间(单位为分钟)   
CacheName="Dvbbs" '缓存组的总名称   
End Sub   
 
Private Sub SetCache(SetName,NewValue)   
Application.Lock   
Application(SetName) = NewValue   
Application.unLock   
End Sub   
 
Public Property Let Name(ByVal vNewValue) '缓存对象名称   
LocalCacheName=LCase(vNewValue)   
End Property   
 
Public Property Let Value(ByVal vNewValue) '读取和写入缓存数据   
If LocalCacheName<>"" Then   
CacheData=Application(CacheName"_"&LocalCacheName)   
If IsArray(CacheData) Then   
CacheData(0)=vNewValue   
CacheData(1)=Now()   
Else   
ReDim CacheData(2)   
CacheData(0)=vNewValue   
CacheData(1)=Now()   
End If   
SetCache CacheName"_"&LocalCacheName,CacheData   
Else   
Err.Raise vbObjectError + 1, "DvbbsCacheServer", " please change the CacheName."   
End If   
End Property   
 
Public Property Get Value()   
If LocalCacheName<>"" Then   
CacheData=Application(CacheName"_"&LocalCacheName)   
If IsArray(CacheData) Then   
Value=CacheData(0)   
Else   
Err.Raise vbObjectError + 1, "DvbbsCacheServer", " The CacheData Is Empty."   
End If   
Else   
Err.Raise vbObjectError + 1, "DvbbsCacheServer", " please change the CacheName."   
End If   
End Property   
 
Public Function ObjIsEmpty() '判断当前缓存是否过期   
ObjIsEmpty=True   
CacheData=Application(CacheName"_"&LocalCacheName)   
If Not IsArray(CacheData) Then Exit Function   
If Not IsDate(CacheData(1)) Then Exit Function   
If DateDiff("s",CDate(CacheData(1)),Now()) < 60*Reloadtime Then ObjIsEmpty=False   
End Function   
 
Private Sub makeEmpty(SetName) '释放内存   
Application.Lock   
Application(SetName) = Empty   
Application.unLock   
End Sub   
 
Public Sub DelCahe(MyCaheName) '删除缓存   
makeEmpty(CacheName"_"&MyCaheName)   
End Sub   
End Class   
 
'Set WydCache=New Cls_Cache   
'WydCache.Reloadtime=0.5 '定义过期时间 (以分钟为单位)   
'WydCache.CacheName="pages" '定义缓存名   
'IF WydCache.ObjIsEmpty() Then ''判断是否可用(包括过期,与是否为空值)   
'Response.write WydCache.Value   
'Else   
'..................   
'BoardJumpList=xxx   
'WydCache.Value=BoardJumpList '写入内容   
'Response.write BoardJumpList   
'End if   
'   
'mycache.DelCahe(" 缓存名") 删除缓存   
%>

(0)

相关推荐

  • asp缓存类

    至于缓存的作用,我想我也不用再多说了,它的作用已经很明显,特别是对于信息量非常大或是全数据库页面的网站,他能很好地利用主机的内存资源,加速ASP的执行效率,减轻服务器的负担,而动网在这一方面做得是最突出的,像他现在的dvbbs7.1.0版,更是在缓存的利用上更上一层楼,前后台大多的操作都和缓存有关,而现在动网里用的也就是迷城浪子的缓存类,下面列出动网的三大高手写的ASP缓存类 木鸟写的 复制代码 代码如下: '*******************************************

  • asp自带的内存缓存 application

    函数getcache,会自动建立需要的缓存. 复制代码 代码如下: Function getcache(funsname,isreset,isarr,timeinfo) 'funsname - 需要缓存的内容,这里要输入一个function名 'isreset –是否更新[值:0(根据时间或判断缓存为空时自动更新).1(主动更新)] ' isarr -- 所缓存的内容是否为一个数据[0为字符串,1为数组] ' timeinfo -- 缓存更新时间,单位为秒,当值为0时,则只在缓存为空时,才更新

  • ASP缓存技术详解

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

  • Hibernate框架中的缓存技术详解

    本文实例讲述了Hibernate框架中的缓存技术.分享给大家供大家参考,具体如下: Hibernate框架的缓存分为Session的缓存.SessionFactory的缓存,也称为一级缓存和二级缓存. 一级缓存: 一级缓存是Session级的缓存,其生命周期很短,与Session相互对应,由Hibernate进行管理,属于事务范围的缓存.当程序调用 Session的load()方法.get()方法.save()方法.saveOrUpdate()方法.update()方法或查询接口方法时,Hibe

  • C#函数式编程中的缓存技术详解

    缓存技术 该节我们将分成两部分来讲解,第一部分为预计算,第二部分则为缓存.缓存这个技术对应从事开发的人员来说是非常熟悉的,从页面缓存到数据库缓存无处不在,而其最重要的特点就是在第一次查询后将数据缓存,在以后的查询过程中就无需重新计算而直接从内存中将结果返回,大大提高了性能,而我们这里的缓存则集中运用在函数上.  预计算 可能一些人并不能立马理解这个词的含义,所以我们就简单的从生活例子出发介绍一下.很多人在工作中一定会这样做事,比如上级吩咐了你一件事,但是这件事的后半部分要等另一个同事做好之后把对

  • thinkphp缓存技术详解

    本文详细分析了thinkphp的缓存技术.分享给大家供大家参考.具体分析如下: 如果没有缓存的网站是百万级或者千万级的访问量,会给数据库或者服务器造成很大的压力,通过缓存,大幅减少服务器和数据库的负荷,假如我们把读取数据的过程分为三个层,第一个是访问层,第一个是缓存层,第三个是数据库存取层,如果没有缓存层,访问层是直接从数据库存取层读取数据,而设置缓存后,访问层不再是直接在数据库存取层读取,而是从缓存层读取数据. 我们做个简单的对比,假设一个页面,在一个小时可被访问100万次,如果这个页面每次被

  • ASP.NET MVC中使用jQuery时的浏览器缓存问题详解

    介绍 尽管jQuery在浏览器ajax调用的时候对缓存提供了很好的支持,还是有必要了解一下如何高效地使用http协议. 首先要做的事情是在服务器端支持HTTP GET,定义不同的URL输出不同的数据(MVC里对应的就是action).如果要使用同一个地址获取不同的数据,那就不对了,一个HTTP POST也不行因为POST不能被缓存.许多开发人员使用POST主要有2个原因:明确了数据不能被缓存,或者是避免JSON攻击(JSON返回数组的时候可以被入侵). 缓存解释 jQuery全局对象里的ajax

  • spring缓存代码详解

    本文研究的主要是spring缓存的相关内容,具体介绍如下. 这篇文章是根据谷歌翻译大致修改出来的,由于原文不知道是什么语,所以可能导致翻译的有错误和不准确的地方,但是大致的方向感觉还是蛮不错的,所以在这里整理了一下,希望能够有所帮助. 高速缓存一直是一个非常需要这两个提高应用程序性能并降低其工作量.此外,它的用处今天是特别明显,可以作出处理成千上万的游客concurrents.D'un架构上的Web应用,高速缓存管理正交于应用程序的业务逻辑和出于这个原因,应该对应用程序本身的发展产生的影响最小.

  • vue服务端渲染缓存应用详解

    服务端渲染简介 服务端渲染不是一个新的技术:在 Web 最初的时候,页面就是通过服务端渲染来返回的,用 PHP 来说,通常是使用 Smarty 等模板写模板文件,然后 PHP 服务端框架将数据和模板渲染为页面返回,这样的服务端渲染有个缺点就是一旦要查看新的页面,就需要请求服务端,刷新页面. 但如今的前端,为了追求一些体验上的优化,通常整个渲染在浏览器端使用 JS 来完成,配合 history.pushState 等方式来做单页应用(SPA: Single-Page Application),也收

  • nginx proxy_cache 缓存配置详解

    前言: 由于本人工作原因,涉及到网络直播领域,其中视频的回放下载,涉及到了一些视频下载方面的技术.针对于一个完整视频的下载,目前市面上的主流做法是,先将整个视频流切片,存储到文件服务器中,在用户需要观看回放视频时.通过一个视频回源服务器,去文件服务器中逐个请求切片,返回给用户播放. 今天着重探讨的是关于回源服务器缓存的配置以及合理的缓存策略. 通过给回源服务器配置缓存的案例,详细讲解一整套缓存配置机制,并且可沿用到其他任何缓存配置场景中. 今天的讲解分为四点: 回源服务器的工作是啥为啥 需要给回

  • Java WebService技术详解

    目录 WebService WebService简介 WebService原理 JAVA WebService规范 (1)JAX-WS: (2)JAXM&SAAJ: (3)JAX-RS: WebService入门案例 服务端的实现 客户端的实现 WSDL 文档结构 阅读方式 SOAP SOAP结构 UDDI Webservice的客户端调用方式 一:生成客户端调用方式 二:service编程调用方式 三:HttpURLConnection调用方式 使用注解修改WSDL内容 WebService

  • Spring 整合 Hibernate 时启用二级缓存实例详解

    Spring 整合 Hibernate 时启用二级缓存实例详解 写在前面: 1. 本例使用 Hibernate3 + Spring3: 2. 本例的查询使用了 HibernateTemplate: 1. 导入 ehcache-x.x.x.jar 包: 2. 在 applicationContext.xml 文件中找到 sessionFactory 相应的配置信息并在设置 hibernateProperties 中添加如下代码: <!-- 配置使用查询缓存 --> <prop key=&q

随机推荐