在介绍这些技术之前先说明一下到底什么是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的一些属性。同时也回答了一些网友曾经提到过的能否在Applocation中使用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&
请稍等,评论加载中...