您的位置: 首页 > 技术文档 > 网络编程 > [ASP]提高数据显示效率--缓存探幽
WebService的基本概念 回到列表 NoahWeb应用——模组资源
 [ASP]提高数据显示效率--缓存探幽

作者:5do8 时间: 2005-09-07 文档类型:原创 来自:蓝色理想

写在前面的话:此篇还是asp相关的,相信玩ASP的都有这个感觉,当数据有5万多条时-------just like音乐网,要调用最新的10条在页面显示,糟糕的是,当n多用户打开页面访问的时候,每个用户每次都要读取数据库一次,这无疑降低了效率,很明显,如果能把数据能保存在内存上,然后读取,无疑加快了速度. 所谓缓存其实就是在内存中开辟一个用来保存数据的空间,使用缓存你就不用频繁的访问你保存在硬盘上的数据了,因为这些数据我们希望每个用户都能看到效果一样,考虑使用的是application对象,因为它是所有访问者的共用的对象,存储的信息和定义的事件能够为所有者访问者使用,这里要使用asp内置对象APPLICATION了,关于application,有2个方法[lock和unlock],2个集合[content和staticobjects],2个事件[开始的application_onstart和application_end],application变量不会因为用户的离开而消失,一旦建立,一直等到网站关闭和程序卸载为止,正因为如此,使用的时候要特别小心!,否则会占用内存,我在这里不用多说,有兴趣的查阅相关资料吧,大体是这样.我们是把数据写入一个自定义的application里面,在制定的时间读取刷新的,大体思路就是这样.

实例演示.先建立一个简单的数据库,写个function读取一下,写入一个dim变量temp中:

Function DisplayRecords()
'这个函数原来给一个变量temp付上记录的值
Dim sql, conn, rs
'符合条件的sql语句
sql = "SELECT id, [szd_f], [szd_t] FROM admin"
'打开数据库连接
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="&Server.MapPath("db.mdb")
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open sql, conn, 1, 3
'当符合sq语句l的数据没有显示完毕时
If Not rs.EOF Then
'给temp变量赋值
Dim temp
temp = "<table width=""90%"" align=""center"""
temp = temp & " border=""1"" bordercolor=""silver"""
temp = temp & " cellspacing=""2"" cellpadding=""0"">"
temp = temp & "<tr bgcolor=""#CCDDEE""><td width=""5%"""
temp = temp & ">ID</td><td>操作</td>"
temp = temp & "<td>数值</td></tr>"
'存在数据,接着赋值
While Not rs.EOF
temp = temp & "<tr><td bgcolor=""#CCDDEE"">"
temp = temp & rs("ID") & "</td><td>" & rs("szd_f")
temp = temp & "</td><td>" & rs("szd_t")
temp = temp & "</td></tr>"
rs.MoveNext
Wend

temp = temp & "</table>"
'temp赋值完毕,把它再返回给函数
DisplayRecords = temp
Else
DisplayRecords = "Data Not Available."
End If
'释放内存
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End Function

ok,上面的函数改造完毕,调用的时候就是DisplayRecords.

下面是application大显身手了:

'该函数是写入缓存
Function DisplayCachedRecords(Secs)
Dim retVal, datVal, temp1
'Secs是每次要刷新数据的时间, retVal是数据,datVal是剩余时间
retVal = Application("cache_demo") '取得appliction的值
datVal = Application("cache_demo_date") '取得appliction的值
'判断datVal 的值,也就是要计算时间过去了没
If datVal = "" Then
'如果是空,datVal值为当前时间按秒加上secs定义的时间
datVal = DateAdd("s",Secs,Now)
End If
'temp1是判断当前时间和datVal的秒差
temp1 = DateDiff("s", Now, datVal)
'如果retVal已经是上面函数的返回值且时间大于0
If temp1 > 0 And retVal <> "" Then
'本函数返回记录数
DisplayCachedRecords = retVal
Response.Write "<b><font color=""green"">利用缓存读取数据"
Response.Write " ... (" & temp1 & " 秒剩余)</font></b>"
Response.Write "<br><br>"
Else
'retVal 是空的话,就赋予DisplayRecords的值给变量temp2
Dim temp2
temp2 = DisplayRecords()
'保存到Application.------------------>重点
Application.Lock
Application("cache_demo") = temp2
Application("cache_demo_date") = DateAdd("s",Secs,Now)
Application.UnLock
DisplayCachedRecords = temp2
' 这里随便写上了记录的缓存的过去时间,相对总秒数倒差 :
Response.Write "<b><font color=""red"">刷新缓存显示 ..."
Response.Write "</font></b><br><br>"
End If
End Function
%>

说明完毕.

以下为完整无注释代码

<%
Function DisplayRecords()
Dim sql, conn, rs
sql = "SELECT id, [szd_f], [szd_t] FROM admin"
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="&Server.MapPath("db.mdb")
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open sql, conn, 1, 3
If Not rs.EOF Then
Dim temp
temp = "<table width=""90%"" align=""center"""
temp = temp & " border=""1"" bordercolor=""silver"""
temp = temp & " cellspacing=""2"" cellpadding=""0"">"
temp = temp & "<tr bgcolor=""#CCDDEE""><td width=""5%"""
temp = temp & ">ID</td><td>操作</td>"
temp = temp & "<td>数值</td></tr>"
While Not rs.EOF
temp = temp & "<tr><td bgcolor=""#CCDDEE"">"
temp = temp & rs("ID") & "</td><td>" & rs("szd_f")
temp = temp & "</td><td>" & rs("szd_t")
temp = temp & "</td></tr>"
rs.MoveNext
Wend
temp = temp & "</table>"
DisplayRecords = temp
Else
DisplayRecords = "Data Not Available."
End If
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End Function

Function DisplayCachedRecords(Secs)
Dim retVal, datVal, temp1
retVal = Application("cache_demo")
datVal = Application("cache_demo_date")
If datVal = "" Then
datVal = DateAdd("s",Secs,Now)
End If
temp1 = DateDiff("s", Now, datVal)
If temp1 > 0 And retVal <> "" Then
DisplayCachedRecords = retVal
Response.Write "<b><font color=""green"">利用缓存读取数据"
Response.Write " ... (" & temp1 & " 秒剩余)</font></b>"
Response.Write "<br><br>"
Else
Dim temp2
temp2 = DisplayRecords()
Application.Lock
Application("cache_demo") = temp2
Application("cache_demo_date") = DateAdd("s",Secs,Now)
Application.UnLock

DisplayCachedRecords = temp2
Response.Write "<b><font color=""red"">刷新缓存显示 ..."
Response.Write "</font></b><br><br>"
End If
End Function
%>

调用方法:

<%=DisplayCachedRecords(20)%>

写在后面的话:如果你感觉你的服务器内存不够大的话,不要大量使用缓存.

下载: cache.rar

出处:蓝色理想
责任编辑:moby

◎进入论坛网络编程版块参加讨论

相关文章 更多相关链接
web关联菜单实现方法
[asp]怎么添加验证码的解决方法
开发ASP组件引用asp内置对象方法
[ASP]利用 xmlhttp 分块上传文件
ASP 中健壮的页结构的异常处理
热门搜索:CSS Fireworks 设计比赛 网页制作 web标准 用户体验 UE photoshop Dreamweaver Studio8 Flash 手绘 CG
站点最新 站点最新列表
悟道web标准:前端性能优化
纯中文域名".中国"今日提交申请
世界之窗3.0皮肤设计大赛结果公布
使用jQuery制作滑动动画效果的层
如何设计网页横幅
Plump 图标设计
Subrat Nayak图标设计
百度知道推出文档分享服务
CSS Sprites(CSS雪碧):要还是不要?
UIRSS三周年纪念日推出V2公测版
栏目最新 栏目最新列表
Firefox的Jetpack扩展案例分析
阿里妈妈UED谈CSS Sprites技术
Photoshop中设计绿色时尚Web网站
操作Dom节点实现间歇滚动新闻
浏览器15年历史回顾
如何创建Firefox的Jetpack扩展
全透视:CSS Z-index 属性
用PS 3D工具绘制甜麦圈包装袋
悟道Web标准:让W3C标准兼容终端
悟道WEB标准:统一思想,遵循标准

蓝色理想版权申明:除部分特别声明不要转载,或者授权我站独家播发的文章外,大家可以自由转载我站点的原创文章,但原作者和来自我站的链接必须保留(非我站原创的,按照原来自一节,自行链接)。文章版权归我站和作者共有。

转载要求:转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印,亦不能抹去我站点水印。

特别注意:本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有,文章若有侵犯作者版权,请与我们联系,我们将立即删除修改。

本文总共有 9 条评论,现在显示最新的 5 条。暂时没有人参与评分


cjj31 Publish at 2006-4-14 16:42:21
"recordset的open占用的数据池一定会比execute大的.可参考O’Reilly的ASP ADO2.6那本书."

to kumozaki:能否具体解释一下之间的比较?我的印象当中connection.execute 等价于 RecordSet.Open sql,conn,0,0
5do8 Publish at 2005-11-9 13:49:01
这样不好,那样不好,那怎么办?:D

我现在是这样作的:

把控制更新缓存的key也放在一个数组里面,后台控制更新.
KUMOZAKI Publish at 2005-11-7 17:52:11
看了楼主修改的那篇code,发现还是改进了不少,多用用getrows和getstrings,一般情况下这是个好习惯.....
可读性也强了,不过耦合性其实还可能更低的...
kumozaki Publish at 2005-11-7 17:44:31
to cjj31
可能我回复得比较含糊吧,不好意思.我所指的execute不是对象,而是connection对数据库的其中一种方法,recordset的open占用的数据池一定会比execute大的.可参考O’Reilly的ASP ADO2.6那本书.

我个人所强调缓存机制的管理性能是指缓存的时失效性,起名的自由性,管理的方便性等,用探针看其application是一种方法吧,我只是从这种不是唯一的方法看出了相对需要改善的地方,不过作者5do8是写给初学者看的,那么这篇文章还是值得一看的,建议作者最好在重点地方加上注释吧,阅读时会相对轻松一点...
5do8 Publish at 2005-10-12 21:51:52
用application控制cache,不重新查找数据

我先自我批评一下,好不好?我原写这个的原因是想给一些初学者一点思路,结果招来大家的一片批评声,等过短时间悄悄的剪下你们的脑瓜子,哈哈哈,不开玩笑了,确实写的不好,阅读性也不是太好的说,哈哈哈,下面我改了一下,说说我的一点思路吧.

先看源码,如果你不能理解的话就看这段
一般的说,要调用的东西是少变换的,但,一些比如首页帖子调用等还是要动的嘛,问题是说不定一年不更新,说不定10秒更新一次,如果每次设置更新时间固定的话,我认为这是不太明智的,哈哈哈,因为你想想这样有多少此的浪费查询或者错过更新的最好时期?想了一下,我认为这样是可以做的,我们设置一个application值,如果这个值是1的话就更新数据库读到缓存中,不是的话就就.......就取老值在缓存中.但是,像经典论坛这样的大型论坛,如果这样做有点奢侈,虽然可以判断发帖量超过一定数量时才改application,然后读缓存,这么麻烦还不如定期更新得了.................这是一点我说的,相应大家的精神,我也用用GetRows这个数组操作吧,这厮让我不挨了不少........不过确实是个好东西,okok,我就公布源码,当然,还不完善,谁像完善就继续继续吧,可看性也变了变,很干净...............

源码:
<%  Dim strDbPath
Dim connstr
strDbPath = "data\db.mdb"
connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
connstr = connstr & Server.MapPath(strDbPath)
Set conn = Server.CreateObject("Adodb.Connection")
conn.open connstr

function CloseConn()
    If IsObject(conn) Then
    conn.close
    End If
    Set conn = nothing
End Function

  sub updatedata(size_n)
    If isNumeric(application("cachecheck")) = 0 Then
    Application.Lock
    application("cachecheck") = 1
    Application.UnLock
    End If
    response.write(application("cachecheck"))
    If application("cachecheck")=1 Or  application("cachecheck")="" Then
    Application.Lock
    application("cachecheck") =0
    Application.UnLock
    response.write("更新缓存:"&application("cachecheck"))
    sql="select top "&size_n&" * from szd_data"
    Set rs=conn.execute(sql)
    dim data
    If Rs.Eof Then
    data="no data"
    Else
    data=Rs.GetRows()
    rs.close
    set  rs=Nothing
    CloseConn()
    Application.Lock
    application("data") =data
    Application.UnLock
    End If
    End if
    data=application("data")
    intber=UBound(data)
    For ii=0 To intber
    response.write(ii+1&"<hr/>")
    For i=0 To size_n-1
    response.write(data(ii,i)&"<br/>")
    Next
    Next

End sub

 %>
 <%Call updatedata(10)%>



再次说明,更新application("cachecheck")才读取数据库更新数据,至于更新application("cachecheck")就看你的需要和方式了.

我做好了心理准备,来吧....................谢谢观赏.

查看全部评论

您的评论
用户名:  口令:
说明:输入正确的用户名和密码才能参与评论。如果您不是本站会员,你可以注册 为本站会员。
注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。
不评分 1 2 3 4 5
注意:请不要在评论中含与内容无关的广告链接,违者封ID
请您注意:
·不良评论请用报告管理员,以利管理员及时删除。
·尊重网上道德,遵守中华人民共和国的各项有关法律法规
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·本站评论管理人员有权保留或删除其管辖评论中的任意内容
·您在本站发表的作品,本站有权在网站内转载或引用
·参与本评论即表明您已经阅读并接受上述条款
推荐文档 | 打印文档 | 评论文档 | 报告错误  
专业书推荐 更多内容
《Web标准设计》
闪魂-FlashCS4完美入门与案例精粹
Waver_h's华丽世界
Illustrator CS3质感绘画表现技法
《Flash短片轻松学》
《用户体验要素》
《JavaScript语言精粹》
作品集 更多内容

一条鱼 2010-2月作品 酷熊体验馆 公寓类地产站 贝克洛门窗 Kids and Science 双生子日记星座卡 房地产教学案例