关于动网迷城浪子(老迷)的缓存类的始末。
2008-06-22 13:03 废墟中的垃圾 阅读(1006) 评论(0) 收藏 举报首先要说明的,我不是一个教授,只是一个求知者。所以这里的很多是真的疑问,而不是指责,希望大家不要喷我。
首先要引用一句老迷同志的话“ASP是几种开发语言里难度最高的,工作量巨大,要求程序员的水平要很高,技术要全面,所以好事自然是多磨了.”
所以向所有奋斗在asp真正研发前段的程序员致敬(这里不包括Ctrl+C,Ctrl+V 的兄弟们,呵呵。)
现在开始正规主体,本来想写整体的关于网站缓存,包括静态化,内存的相关内容,发起一系列的疑问,但是发现内容是在太多了,OK,今天只谈老迷的缓存类(Application相关)
在动网7之前,用的都是vbs,这个时期,老迷开发出来一个缓存类,代码如下
Class Cls_Cache 
Rem ==================使用说明====================
Rem = 本类模块是动网先锋原创,作者:迷城浪子。如采用本类模块,请不要去掉这个说明。这段注释不会影响执行的速度。
Rem = 作用:缓存和缓存管理类
Rem = 公有变量:Reloadtime 过期时间(单位为分钟)缺省值为14400
Rem = MaxCount 缓存对象的最大值,超过则自动删除使用次数少的对象。缺省值为300
Rem = CacheName 缓存组的总名称,缺省值为"Dvbbs",如果一个站点中有超过一个缓存组,则需要外部改变这个值。
Rem = 属性:Name 定义缓存对象名称,只写属性。
Rem = 属性:value 读取和写入缓存数据。
Rem = 函数:ObjIsEmpty()判断当前缓存是否过期。
Rem = 方法:DelCahe(MyCaheName)手工删除一个缓存对象,参数是缓存对象的名称。
Rem ========================
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
Private Sub makeEmpty(SetName)
Application.Lock
Application(SetName) = Empty
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 If
End Function
Public Sub DelCahe(MyCaheName)
makeEmpty(CacheName&"_"&MyCaheName)
End Sub
End Class 这里主要是Application存放一个数组,数组一个元素保存Application名称,第二个元素保存到期时间。
然后网上的调用Demo是
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 而实际上这个Demo不知道为什么,复制出来就是错的。然后我就唐突的问老迷了错误原因,然而没有得到满意的答复,同时呢,老迷说了一句,如果我用jscript,有一个更好的。然后出来了第二个版本的缓存类。
<script language="jscript" runat="server">
//缓存操作类
W3sky.Config.WebName = "Myvery";
function Caches(){
this.CacheName=W3sky.Config.WebName+"$";
this.CacheTimeOut=1200000;
//获取一个指定的缓存数据,如果不存在或过期,返回null
this.get=function(key)
{
if(typeof(Application(this.CacheName+key+"$time"))=="undefined") return null;
var exttime=String(Application(this.CacheName+key+"$time"));
exttime=parseFloat(exttime);
if(!isNaN(exttime)){
if((new Date()).getTime()< exttime+this.CacheTimeOut)
{
return String(Application(this.CacheName+key));
}else{
this.remove(key);
}
}
return null;
};
//注销指定的缓存
this.remove=function(key){
Application.Lock;
Application.Contents.Remove(this.CacheName+key+"$time");
Application.Contents.Remove(this.CacheName+key);
Application.unLock;
};
//注销所有缓存
this.removeAll=function(){
var x;
var e = new Enumerator(Application.Contents);
for (;!e.atEnd();e.moveNext())
{
x = e.item();
if(x.indexOf(this.CacheName)!=-1 && x.indexOf("$time")==-1){
Application.Lock;
Application.Contents.Remove(x+"$time");
Application.Contents.Remove(x);
Application.unLock;
}
};
};
//写入一个指定的缓存
this.set=function(key,value){
Application.Lock;
Application(this.CacheName+key+"$time")=(new Date()).getTime();
Application(this.CacheName+key)=value;
Application.unLock;
};
};
</script>
学习了一下新的jscript类,实际上就是使用名称相关的方式来,使用两个Application来控制一个Application内容。
看了上面的两个方式,我很难看出来第二个类的优势在于什么。当然你可以说,jscript可以实现继承封装和重载。我不得不承认vbs在这里做的不是很好。但是这里是后面这个类比第一个强的解释吗?如果你非说,只要使用了jscript就比vbs好,效率高很多倍。那么我没有什么话说了。
Application每个创建都是很消耗资源的,那么使用一个Application来管理是不是就能少的消耗资源呢?同时把时间和内容的管理放在一个Application内部,这样不是更好的内聚吗?而且如果网站使用的Application比较多,两个会是什么样子呢?
这些疑问,不知道各位有没有想过,能否回答一下。
浙公网安备 33010602011771号