Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29307724
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: 系统运维

2009-04-27 13:40:43

1.网上有个朋友是提供这样的缓存实现机制的(http://tenglong.blog.51cto.com/180708/30028)
解决办法:
1、当客户端请求一个ASP页面的时候,首先将请求交给文件缓存模块处理,文件缓存判断请求是否是POST,如果是POST,则不执行缓存相关操作;同时判断请求是否是不需要缓存的请求。如果是不需要缓存的,则不进行缓存相关操作。
2、如果是需要使用缓存功能。通过URL地址以及QUERYSTRING参数,寻找缓存文件。如果找不到缓存文件,或者缓存文件过期。则重新获取缓存文件数据,并生成新的缓存文件数据。
3、将获取到的缓存文件数据发送到客户端,停止ASP文件的执行(response.end)。

2.网上另一个朋友写的技术文章摘录如下:()
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个查询关键字,那么管理这些关键字同缓存的对应也是麻烦事)。

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

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

DisplayBooks.ASP文件
  1. <%@ LANGUAGE=JavaScript %>   
  2.   
  3.   
  4.   
  5. 书籍分类; <%= getBooksListBox() %>   
  6.   

  7.   
  8. <%   
  9. function getBooksListBox()   
  10. {   
  11. BooksListBox = Application("BooksListBox")   
  12. if (BooksListBox != null) return BooksListBox;   
  13. crlf = String.fromCharCode(13, 10)   
  14. BooksListBox = "< select name=Books>" + crlf;   
  15. SQL = "Select * FROM Books orDER BY Name";   
  16. cnnBooks = Server.CreateObject("ADODB.Connection");   
  17. cnnBooks.Open("Books""Admin","");   
  18. rstBooks = cnnBooks.Execute(SQL);   
  19. fldBookName = rstBooks("BookName");   
  20. while (!rstBooks.EOF){   
  21. BooksListBox = BooksListBox + " < option>" +   
  22. fldBookName + "" + crlf;   
  23. rstBooks.MoveNext();   
  24. }   
  25. BooksListBox = BooksListBox + ""  
  26. Application("BooksListBox") = BooksListBox   
  27. return BooksListBox;   
  28. }   
  29. %>  .
借助了Application进来的实现缓存的。
很简单把,其实就是用了很简单的Application技术,而且就一句话的不同:
Application("BooksListBox") = BooksListBox
你可以验证一下你就会发现服务器上的请求数量会降低不少的。这种情况尤其适合与那些更新不是很频繁的网站内容,例如你一天(或则很长时间)只更新一次。

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

文件GLOBAL.ASA
  1. < !--METADATA TYPE="TypeLib" FILE="C:\Program Files\Common  
  2. Files\system\ado\msado15.dll"-- >   
  3. < SCRIPT LANGUAGE=VBScript RUNAT="Server" >   
  4. Sub Application_OnStart   
  5. SQL = "Select UserName, Password FROM UserInfo"  
  6. cnnUsers = "DSN=User"  
  7. Set rsUsers = Server.CreateObject("ADODB.Recordset")   
  8. '注意下面这两句话,就是用来实现那个叫可用的断开连接的ADO技术   
  9. rsCustomers.CursorLocation = adUseClient   
  10. rsCustomers.Open SQL, cnnAdvWorks, adOpenStatic, AdLockReadOnly   
  11. ' 断开RecordSet的和数据库的连接   
  12. rsCustomers.ActiveConnection = Nothing  
  13. Set Application("rsCustomers") = rsCustomers   
  14. End Sub  
文件Users.ASP
 
  1. <%   
  2. 'Clone方法使得每个用户拥有自己的一个RecordSet集合   
  3. Set yourUsers = Application("rsUsers").Clone   
  4. Set UserName = yourUsers("UserName")   
  5. Set Password = yourUsers("Password")   
  6. Do Until yourUsers.EOF   
  7. %>   
  8. 用户姓名:< %= UserName % > 用户密码:< %= Password % >   
  9. <%   
  10. yourUsers.MoveNext   
  11. Loop  
  12. %>  

ASP/Visual Basic代码
  1. <%   
  2. Class Cls_Cache   
  3. '==================使用说明====================   
  4. '本类模块是动网先锋原创,作者:迷城浪子。如采用本类模块,请不要去掉这个说明。这段注释不会影响执行的速度。   
  5. '作用:缓存和缓存管理类   
  6. '公有变量:Reloadtime 过期时间(单位为分钟)缺省值为14400   
  7. 'MaxCount 缓存对象的最大值,超过则自动删除使用次数少的对象。缺省值为300   
  8. 'CacheName 缓存组的总名称,缺省值为"Dvbbs",如果一个站点中有超过一个缓存组,则需要外部改变这个值。   
  9. '属性:Name 定义缓存对象名称,只写属性。   
  10. '属性:value 读取和写入缓存数据。   
  11. '函数:ObjIsEmpty()判断当前缓存是否过期。   
  12. '方法:DelCahe(MyCaheName)手工删除一个缓存对象,参数是缓存对象的名称。   
  13. '========================   
  14. Public Reloadtime,MaxCount,CacheName   
  15. Private LocalCacheName,CacheData,DelCount   
  16.   
  17. Private Sub Class_Initialize()   
  18. Reloadtime=14400 '过期时间(单位为分钟)   
  19. CacheName="Dvbbs" '缓存组的总名称   
  20. End Sub  
  21.   
  22. Private Sub SetCache(SetName,NewValue)   
  23. Application.Lock   
  24. Application(SetName) = NewValue   
  25. Application.unLock   
  26. End Sub  
  27.   
  28. Public Property Let Name(ByVal vNewValue) '缓存对象名称   
  29. LocalCacheName=LCase(vNewValue)   
  30. End Property  
  31.   
  32. Public Property Let Value(ByVal vNewValue) '读取和写入缓存数据   
  33. If LocalCacheName<>"" Then  
  34. CacheData=Application(CacheName"_"&LocalCacheName)   
  35. If IsArray(CacheData) Then  
  36. CacheData(0)=vNewValue   
  37. CacheData(1)=Now()   
  38. Else  
  39. ReDim CacheData(2)   
  40. CacheData(0)=vNewValue   
  41. CacheData(1)=Now()   
  42. End If  
  43. SetCache CacheName"_"&LocalCacheName,CacheData   
  44. Else  
  45. Err.Raise vbObjectError + 1, "DvbbsCacheServer"" please change the CacheName."  
  46. End If  
  47. End Property  
  48.   
  49. Public Property Get Value()   
  50. If LocalCacheName<>"" Then  
  51. CacheData=Application(CacheName"_"&LocalCacheName)   
  52. If IsArray(CacheData) Then  
  53. Value=CacheData(0)   
  54. Else  
  55. Err.Raise vbObjectError + 1, "DvbbsCacheServer"" The CacheData Is Empty."  
  56. End If  
  57. Else  
  58. Err.Raise vbObjectError + 1, "DvbbsCacheServer"" please change the CacheName."  
  59. End If  
  60. End Property  
  61.   
  62. Public Function ObjIsEmpty() '判断当前缓存是否过期   
  63. ObjIsEmpty=True  
  64. CacheData=Application(CacheName"_"&LocalCacheName)   
  65. If Not IsArray(CacheData) Then Exit Function  
  66. If Not IsDate(CacheData(1)) Then Exit Function  
  67. If DateDiff("s",CDate(CacheData(1)),Now()) < 60*Reloadtime Then ObjIsEmpty=False  
  68. End Function  
  69.   
  70. Private Sub makeEmpty(SetName) '释放内存   
  71. Application.Lock   
  72. Application(SetName) = Empty   
  73. Application.unLock   
  74. End Sub  
  75.   
  76. Public Sub DelCahe(MyCaheName) '删除缓存   
  77. makeEmpty(CacheName"_"&MyCaheName)   
  78. End Sub  
  79. End Class  
  80.   
  81. 'Set WydCache=New Cls_Cache   
  82. 'WydCache.Reloadtime=0.5 '定义过期时间 (以分钟为单会)   
  83. 'WydCache.CacheName="pages"'定义缓存名   
  84. 'IF WydCache.ObjIsEmpty() Then ''判断是否可用(包括过期,与是否为空值)   
  85. 'Response.write WydCache.Value   
  86. 'Else   
  87. '..................   
  88. 'BoardJumpList=xxx   
  89. 'WydCache.Value=BoardJumpList '写入内容   
  90. 'Response.write BoardJumpList   
  91. 'End if   
  92. '   
  93. 'mycache.DelCahe("缓存名")删除缓存   
  94. %> 




阅读(1139) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~