仓酷云

标题: NET网页编程之页面静态化与asp.net缓存机制对照的出色会商 [打印本页]

作者: 愤怒的大鸟    时间: 2015-1-16 14:22
标题: NET网页编程之页面静态化与asp.net缓存机制对照的出色会商
在CSDN里搜索一下“初学”两字,竟有三百余篇帖子(也许更多)。有些帖子说,有了asp的基础,只要15天就能很熟悉了,我甚感自己的愚钝。更多帖子是向大家请教初学者适合看书。两个多月的时间(当然平常杂事比较多。成绩:假设有100万个页面,天天有5%的页面会扫瞄十次以上,有50%的页面只扫瞄一次,剩下45%没人看过。这类情形下是利用页面静态化处置好,仍是利用asp.net的缓存功效好。

以下复兴均来自csdn中牛人们的会商,粘贴以下,很值的我们进修与参考。各会商间利用--分开开,利用[]括起来的暗示是援用其别人的复兴。

静态页面尽人皆知是以空间换工夫.固然这也是一个价值
缓存功效很无效的下降收集的消耗,其他客户机在会见该网站的时分也会经由过程局域网内的缓存猎取数据下降了服务端自己的压力
-----------------------------------------------------------------------

静态页面除以空间换工夫,另有必定的IO消耗,并发量出格年夜的情形下完整接纳静态页面也不是好的办理办法,比方你所提到的假设有100万个页面,乃至更多,天天,有5%的页面会扫瞄十次以上,有50%的页面只扫瞄一次。剩下45%基本没人看过。要我选择的话,在包管这些页面基础不怎样变化的话,我会将这5%的页面在程序初始的到场缓存,将50%的页面在第一次读取的时分到场缓存,剩下的作为静态页面贮存。
能够创建一个静态的类,内里就2个属性,一个页面路径,一个会见次数,纪录每一个页面的哀求信息,然后重载IHttpHandler,在此举行处置,我能够依据上述静态类所供应的信息
,来决意缓存战略
-----------------------------------------------------------------------

(1)从平安角度动身,静态页面是平安的。
(2)正如楼主所说,在按期限内效力较态页面高,但假设有100万个页面,乃至更多,天天,有5%的页面会扫瞄十次以上,有50%的页面只扫瞄一次。剩下45%基本没人看过。应当综合衡量一下,得当的静态化5%的页面,能够思索用MS自带缓存;那50%的页面假如是并发会见,就得交给数据库服务器完成,创建索引,用户查询时静态的天生,oracle这方面对照棒。
(3)实践利用中,效力和平安不乱第一名。
-----------------------------------------------------------------------

援用楼主iuhxq的帖子:
[别的我有个疑问,用缓存时,假如内存不敷了怎样办?是用硬盘寄存,仍是开释缓存?]
成熟的缓存体系关头就是它会智能地抛弃缓存的内容,而这个“抛弃”的机会是经由精益求精,要比你在本人的代码中利用内存体例一般要更合适服务器内存实践情形。

至于功效,就更没法对比了。

缓存体系的次要特性是供应了各类天真的Dependecy,不仅内存到达必定前提(默许是60%),工夫到达必定前提(发生以后的工夫、最初会见工夫),还能够依附于文件改动、数据库改动,乃至本人编写缓存依附前提,这是关头。

关头是关于交互式网站还必要大批利用“片断缓存”。

我没有一棍子打逝世“静态页面”做法,关于很复杂的无交互网站固然能够。我要夸大的是假如你的handler仍旧是asp.net的,网页链接仍是asp.net体例的,假如删除网站的
asp.net体系以后静态页面就不克不及从网站上一般导航到了,那种“静态页面”网站绝对来讲你现在就不该该利用asp.net这类太过初级的工具开辟。
-----------------------------------------------------------------------

我以为静态页面只合适于会见量年夜,而且静态页面数目小的情形
当一个文件夹上面有几千个静态文件的时分,效力呈级数下落
所谓简单被搜刮引擎检索到,静态页面做成伪静态页面也能够的
都存到数据库里,用户会见的时分天生静态页,会见静态页的时分经由过程剧本更新最初会见工夫
然后用WINDOWS服务来决意哪些会见量小的页面要删除
-----------------------------------------------------------------------

援用楼主iuhxq的帖子:
[假设有100万个页面,乃至更多,天天,有5%的页面会扫瞄十次以上,有50%的页面只扫瞄一次。剩下45%基本没人看过。]
实践上,这恰是申明为何有良多公司利用asp.net缘故原由。asp.net是静态网站天生工具,你越是开掘静态交互网站的才能时(比方用户本人选择theme),你才越是必要asp.net。
“100万个页面”实在大概只是从20个aspx中静态发生的。asp.net缓存是内置在静态交互网站上已成熟的手艺,你不必要胶葛因而否必要把全部网站导出和导出以后带来的统统“静态”成绩,间接在asp.net程序自己的优化晋级过程当中轻松弄定,进步功能的同时没有损失任何静态特性,在网站功能晋级过程当中涓滴没有“成事不敷败露不足”之感,何乐而不为。
利用asp.net的关头是会设置最得当的“缓存依附前提”。我看到良多人仅会设置Duration参数,这多是“滥用缓存”大概“不必缓存”的缘故原由。要刚好让依附的数据改动时缓存立即生效,而依附的数据没有改动时要想方设法地优先利用缓存,才干进步网站功能。
-----------------------------------------------------------------------

实在过量利用asp.net缓存成绩相称严峻,真正利用过的就会发明它最严峻的成绩其实不在于它的服务器内存够不敷的成绩,这固然是一个方面,但不是最主要的。
第一个成绩:相称严峻的缓存过时成绩,修改一个dll,修改下设置文件,改动下code立即很使一切缓存被重置,服务器刚入手下手原本就必要大批的CPU的工夫来对dll举行编译,然后再大批的SQL查询,然后再频仍的内存开释和重分派,相称的致命,再以后的相称长工夫内服务器会运转缓慢,究竟一切的缓存都要在碰到会见时从头举行SQL查询,然后从头界说。
第二个成绩:服务器缓存的过时成绩,页面缓存的过时的确偶然候并没有依照料想的时分举行过时,延迟的大概性很年夜,能够声明的事这并非内存不敷的成绩。然后就是没有过时的成绩,仿佛感到上没有大概,实在大概性很年夜,服务器的页面缓存年夜多半都是举行文件依附的,这个文件依附交织错中庞大,确并非100%牢靠。
因而不要过于依附于asp.net的缓存机制,我宁肯你把这类机制创建在第三方的缓存计划上。
至于做静态页大概碰到相称多的静态页面,实在只需你选择了这类计划,假如是碰到百万级的静态页面,那一定是有响应的机制来把持这类的静态页的保存期,而这类机实在相称复杂,这类思索是多虑了,就好像把持IIS的日记增加一样,谁会听任不论的?
-----------------------------------------------------------------------

援用19楼iuhxq的复兴:
[我在想,一个页面大概依附几个表(数据库),一个表大概被多个页面依附。也能够说成是多对多的干系。怎样让这些改动能立即失效,必要深切研讨才干弄分明。我今朝对这个仍是对照含混。没有乐成]

假如明晓得一个页面很少利用,起首是没有需要缓存。

实在,我历来不必页面缓存,我都是片断缓存的。固然我不否决页面缓存,而是对我来讲用户控件才是编程中心,页面都是很复杂的,几近10秒钟创立一个页面,剩下的工夫就是把之前做好的用户控件增加个中并设置它们之间数据和谐分歧。

关于数据库表更新成绩,能够参考有关页面缓存办理中的SqlDependency材料。

也能够复杂一些。我在谁人“怎样看你的缓存是不是失效”的帖子中写的例子里是依据cookie来革新缓存,固然你能够改成前往数据表中的某个“工夫戳”的值。比方一个“用户定单”的界面(不是指定单细节,而是指定单的头部信息),你在数据库中能够为这个“定单”表增添一个“最初修正工夫”字段和增添一个触发器来发生这个字段值,如许定单界面在用户录进细节内容时它的头部信息部分能够作为一个自力的ascx,当用户编纂定单细节时定单头部实践上其实不重修控件。你在定单界面上能够用代码输入定单头部用户控件的工具,你会发明它年夜多半时分是null,也就是说当编纂定单细节时定单头部控件“基本不存在”,asp.net只是从缓存中拿出html间接输入。既然基本没有重修用户控件,固然不会往读数据库。
-----------------------------------------------------------------------

援用19楼iuhxq的复兴:
[方才你提到,关于不常会见的的页面,让他缓存生效,可是我举的例子里有50%页面大概天天会见一次,如许你要一直的缓存、生效。从逻辑上说,也对照走弯路。不如静态页面,一向放那边好。]

一种情形是的确是1个小时也可贵有一个会见,多是基本无需缓存。这类页面即便不缓存,也没有甚么丧失。

另外一种是你完整能够缓存较长工夫,比方缓存1个小时。是否是缓存缓存工夫越长就代表优先级越高?明显不是。假如内存不敷,任何不经常使用的器材起首被从内存删除,跟你设置的Duration有关。因而,假如你设置缓存1个小时,然后它在1个小时后某个工夫点被asp.net在千分之一秒内删除,即便这时代没有一个哀求会见过缓存的页面,消费千分之一秒工夫价值也无所谓。假如你设置为缓存10秒钟,可是一般在10秒钟内不敷够有一个哀求会见它,这个价值才不值得缓存。我们能够瞥见,假如缓存不值得,起首的思索能够是加年夜缓存工夫,比方从10秒钟变成30秒钟、1分钟、5分钟、20分钟、1小时。当很年夜的缓存工夫仍是以为不值得,才基本作废缓存。假如又但愿制止重修控件内容,又惧怕“一直的缓存、生效”,这实际上是自相冲突的。关头是:1:设置了缓存工夫只是最初级的缓存战略,必需同时共同营业请求来把持缓存实时生效;2:信任不管你怎样设置缓存依附前提,缓存体系城市优先依据服务器内存利用情形来本人决意是不是提早清算缓存的工具,因而只管利用缓存其实不会形成服务器内存实践的妨碍。
-----------------------------------------------------------------------

援用23楼zhujiechang的复兴:
[第一个成绩:相称严峻的缓存过时成绩,修改一个dll,修改下设置文件,改动下code立即很使一切缓存被重置,服务器刚入手下手原本就必要大批的CPU的工夫来对dll举行编译,然后再大批的SQL查询,然后再频仍的内存开释和重分派,相称的致命,再以后的相称长工夫内服务器会运转缓慢,究竟一切的缓存都要在碰到会见时从头举行SQL查询,然后从头界说。]

这实在基本不是缓存过时,而是网站更新,全部历程从头启动。甚么时分网站必需更新?假如你天生了一堆静态页面,可是网站必需从头更新,此时那些静态页面可以幸免被重修的运气吗?假如可以幸免,也就无需从头更新网站程序。
-----------------------------------------------------------------------

援用23楼zhujiechang的复兴:
[第二个成绩:服务器缓存的过时成绩,页面缓存的过时的确偶然候并没有依照料想的时分举行过时,延迟的大概性很年夜,能够声明的事这并非内存不敷的成绩。然后就是没有过时的成绩,仿佛感到上没有大概,实在大概性很年夜,服务器的页面缓存年夜多半都是举行文件依附的,这个文件依附交织错中庞大,确并非100%牢靠。]

我最头疼的就是良多人把asp.net的缓存机制说成是“准时保留”工具,这是一种很“坏”的曲解。Duration工夫是我们给缓存一个最初级、最基本的束缚,然后我们就必需给它一个营业必要的“合时生效”束缚。把缓存了解成为在内存中以一段流动的工夫占用内存,这是很偏的,形成了滥用缓存大概不必缓存的了局。

我影象中很难想起哪个是不能不举行文件依附的!除非逻辑上原本就是依附这个文件,不然涓滴无需用文件依附。
别的,文件依附仅必要设置一个文件路径字符串罢了,并非扑朔迷离。真正形成扑朔迷离的,大概使在逻辑上基本无需文件依附的时分必定要将很多别的数据改动导成文件依附这个了局上。这实在查找手艺的成绩。缓存仍是很复杂的,只是你找到的材料少,大概不像先容GridView控件的材料那样地众多罢了。
-----------------------------------------------------------------------

除我的页面都是用户控件组合而成以外(最少我能够在一个页面上仅放一个用户控件,固然至今还不会利用masterpage),不利用页面缓存的来由还包含很主要的:UpdatePanel不撑持。这很天然,全部页面缓存了,UpdatePanel的事务就没法触发。

可是片断缓存完整撑持UpdatePanel。
-----------------------------------------------------------------------

援用31楼only_endure的复兴:
[怎样自已编写缓存依附前提呢?
我看到的书上写的是在数据源控件的声明语句里,加上某属性.完成数据依附(依据数据表格中某个字段或某笔记录),是用声明语句写的.很僵硬.]

我举了一个例子:
http://topic.csdn.net/u/20080428/16/3d1fe832-b328-49b4-9a54-d193e3e03a17.html

VaryByParam、VaryByControl等的例子网上有良多。

实践上,假如利用Page.LoadControl来静态加载用户控件,要晓得PartialCachingControl这个工具(类)的编程。它的CachePolicy属性能够挪用缓存api,它的Dependency属性能够承受你自界说的Dependency。

网上也有一些自界说缓存依附工具的文章,就是从CacheDependency类承继并写本人的把持代码。这些文章中文的大概不太多。

不外我写的谁人例子实在已很够用了,到场一些数据把持的代码来取得正在处置的ascx的工具的信息,就可以到达年夜多半asp.net功能优化的请求。

注重一点,我在网上读过如许的文章,它把数据表保留到Session中,然后年夜谈在甚么逻辑下用代码往从Session中删除数据表。它把这个叫做缓存!我所说的asp.net尽非这类编程,而是指asp.net本身(原生)的缓存。假如把数据表放到Cache中,当内存不敷时缓存体系会主动删除它。因而Session汇合不是缓存,asp.net的数据缓存汇合是指Cache汇合而不是Session汇合。asp.net历程重启也不是缓存革新,全部历程都重启了,缓存固然不见了,可是历程重启并非缓存体系能够决意的事变。
-----------------------------------------------------------------------

静态页弛缓存的对照,这是个很“弄笑”的成绩,由于静态页就是一种缓存计划!所谓静态页,就是把底本要实行才干显现的页面,再有实行需求之前先实行一次,将了局以文件情势缓存到硬盘,这岂非不是缓存?

内存不敷是否是缓存到硬盘,这固然是的。硬盘不敷还能够缓存到磁带呢,不外效力又是另外一个成绩。

总的来讲,存储器越快的就越贵,因而速率快的存储器容量天然越少,因而一定要把内容“缓存”到更年夜的但更慢的存储器上,从CPU的存放器到CPU的高速缓存,再到内存和硬盘,每个级别都云云。真实的成绩是,如何的缓存战略是无效的。静态页是一个特定的缓存战略,良多时分否决自觉寻求静态页,是由于对年夜多半人来讲这类战略都是不合用的,就这么复杂。
-----------------------------------------------------------------------

IIS默许是能够对静态页面举行间接会见的,假如是静态页面,IIS会挪用响应的handler来处置。这是必要必定开支的,可是假如缓存手艺的引进,那末这类开支就小很多了。

至于静态页面的会见触及到文件的IO,我以为,这就要对照fat32,NTFS等文件体系的定位速率和数据库的定位速率哪一个更快一些!!

缓存是程序计划中相当主要的一点!传闻hiberante都有二级缓存了,听了后吓我一跳,细心一问本来就是和全局缓存差未几。不是以速率取胜,而是以缓存的工夫更长、局限更年夜来取胜!
-----------------------------------------------------------------------

假如数据量年夜而且会见量年夜,我感到仍是静态页面的好。并且纯静态的最好了。就是不经由.net处置的页面。间接从IIS发送给客户端。

由于这么做,能够制止“缓存”“生效”“缓存”“生效”这类反复的历程。特别一个网站中,实践上,大批的页面,一天只扫瞄一两次,这时候你如果给他缓存了,那没等有下一团体来会见呢,缓存就生效了,相称于,缓存的使用率(也能够说是射中率)不高。

别的,假如有几万乃至更多的页面,这些放内存里缓存基本放不下,一定会由于内存占用太高招致开释内存(也多是把内存中的数据写进硬盘,缓存了,假如是写进硬盘了,起首他不克不及无穷的写进,有个1,2个G充足年夜了,不克不及写进10G,20g这么多。也就是说仍是有一年夜部分页面被从缓存中移除。)总的说来,仍是间接天生静态页面,放硬盘上对照不乱。

固然,以上都是思索页面变更不频仍的情形。假如真的如SP1234所说,每一个登任命户看到的页面都是本性的。那就只能静态处置分离片断缓存
-----------------------------------------------------------------------

页面静态化和体系缓存各有上风,正确的说体系缓存切实其实是要比静态化页面更初级一点,由于体系缓存是将数据缓存到内存中,而页面静态化是将数据以文本的形状存储在硬盘中。

在楼主的成绩中提到了如许一个假定的情形:
假设有100万个页面,乃至更多,天天,有5%的页面会扫瞄十次以上,有50%的页面只扫瞄一次。剩下45%基本没人看过。

我想说针关于如许一种情形我们就不克不及纯真的来思索究竟是用体系缓存仍是用页面静态化,假如全体用体系缓存的话我们忧虑内存不敷,假如全体用页面静态化又忧虑I/O太高,硬盘读写过于频仍。以是针关于这两种成绩我以为我们应当将页面静态化和体系缓存分离起来利用,我们能够将5%的数据缓存到内存中(利用体系缓存),将45%和50%的数据静态化。
比方Squid这个组件就是将html文件缓存到内存中。Squid在PHP内里常常用到。
-----------------------------------------------------------------------

我们不往计算以上列位牛人的解理谁对谁错,关于还没有迈进牛人行列的我们,好好了解就好了。简单的说:.net只有微软一家在做的,微软也不允许别人跟他做相同的工具,所以他就把需要的工具全部封装在.net的平台上了;而java是公开了。
作者: 仓酷云    时间: 2015-1-18 13:40
大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。
作者: 山那边是海    时间: 2015-1-26 06:19
由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。
作者: 简单生活    时间: 2015-2-4 15:20
是目前ASP在UNIX/Linux上的应用可以说几乎为0)。所以平台的局限性和ASP自身的安全性限制了ASP的广泛应用。
作者: 不帅    时间: 2015-2-10 03:16
这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。
作者: 再现理想    时间: 2015-2-28 18:40
业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。
作者: 老尸    时间: 2015-3-10 05:58
ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。
作者: 再见西城    时间: 2015-3-17 05:10
Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
作者: 变相怪杰    时间: 2015-3-23 22:30
我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2