代码改变世界

关于动网迷城浪子(老迷)的缓存类的始末。

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比较多,两个会是什么样子呢?
这些疑问,不知道各位有没有想过,能否回答一下。