首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 你好,请问你觉得生产静态页面一点意义都没有吗? [已结贴,结贴人:iuhxq]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iuhxq
    • 等级:
    发表于:2008-05-03 08:42:33 楼主
    我知道你一直主张用MS自带的缓存功能。我想知道,你怎么看待静态页面和他两个。能介绍下什么情况下会选择哪个方式吗?

    假如有100万个页面,甚至更多,每天,有5%的页面会浏览十次以上,有50%的页面只浏览一次。剩下45%根本没人看过。

    这种情况你选择这么做?
    另外我有个疑问,用缓存时,如果内存不够了怎么办?是用硬盘存放,还是释放缓存?

    恳请SP1234百忙中给予解答。谢谢。其实关于静态页面还有很多问题,留待下次请教你吧。
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 08:54:141楼 得分:1
    静态页面众所周知是以空间换时间. 当然这也是一个代价

    缓存功能很有效的降低网络的耗损,其他客户机在访问该网站的时候也会通过局域网内的缓存获取数据降低了服务端本身的压力
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • only_endure
    • 等级:
    发表于:2008-05-03 08:58:192楼 得分:1
    学习+顶起+亮出道来等待...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • prewin
    • 等级:
    发表于:2008-05-03 08:58:233楼 得分:1
    以空间换时间的静态页面!
    好题目,关注!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 09:01:084楼 得分:1
    sp1234我看过他的多个帖子确实是一直主张缓存优化。也确实用的很牛。呵呵。学习下。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 09:06:505楼 得分:1
    静态页面可以减轻服务器的压力,大规模的访问,还可以被搜索引擎更多的收入,像百度就很喜欢静态页面!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 09:10:586楼 得分:1
    静态页面除了以空间换时间,还有一定的IO损耗,并发量特别大的情况下完全采用静态页面也不是好的解决方法,例如你所提到的假如有100万个页面,甚至更多,每天,有5%的页面会浏览十次以上,有50%的页面只浏览一次。剩下45%根本没人看过。要我选择的话,在保证这些页面基本不怎么变动的话,我会将这5%的页面在程序初始的加入缓存,将50%的页面在第一次读取的时候加入缓存,剩下的作为静态页面储存。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iuhxq
    • 等级:
    发表于:2008-05-03 09:22:577楼 得分:0
    想法很好,甚至很完美。

    但是实现似乎很复杂。我这个比率只是举个例子,是估算的。你要统计到底哪个页面是浏览量大的,不是很简单事情。而且随着网络流行内容的不同,页面的访问量会变化。

    引用 6 楼 yunfeng007 的回复:
    静态页面除了以空间换时间,还有一定的IO损耗,并发量特别大的情况下完全采用静态页面也不是好的解决方法,例如你所提到的假如有100万个页面,甚至更多,每天,有5%的页面会浏览十次以上,有50%的页面只浏览一次。剩下45%根本没人看过。要我选择的话,在保证这些页面基本不怎么变动的话,我会将这5%的页面在程序初始的加入缓存,将50%的页面在第一次读取的时候加入缓存,剩下的作为静态页面储存。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 09:24:218楼 得分:1
    (1)从安全角度出发,静态页面是安全的。
    (2)正如楼主所说,在定期限内效率较态页面高,但假如有100万个页面,甚至更多,每天,有5%的页面会浏览十次以上,有50%的页面只浏览一次。剩下45%根本没人看过。 应该综合权衡一下,适当的静态化5%的页面,可以考虑用MS自带缓存;那50%的页面如果是并发访问,就得交给数据库服务器完成,建立索引,用户查询时动态的生成,oracle这方面比较棒。
    (3)实际使用中,效率和安全稳定第一位。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 09:44:339楼 得分:1
    引用 7 楼 iuhxq 的回复:
    想法很好,甚至很完美。

    但是实现似乎很复杂。我这个比率只是举个例子,是估算的。你要统计到底哪个页面是浏览量大的,不是很简单事情。而且随着网络流行内容的不同,页面的访问量会变化。

    引用 6 楼 yunfeng007 的回复:
    静态页面除了以空间换时间,还有一定的IO损耗,并发量特别大的情况下完全采用静态页面也不是好的解决方法,例如你所提到的假如有100万个页面,甚至更多,每天,有5%的页面会浏览十次以上,有50%的页…

    是的,是很复杂,完美是不可能的,这里面就有一个算法的问题了;
    例如我可以建立一个静态的类,里面就2个属性,一个页面路径,一个访问次数,记录每个页面的请求信息,然后重载IHttpHandler,在此进行处理,我可以根据上述静态类所提供的信息,来决定缓存策略.

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 09:47:5810楼 得分:1
    如何去界定哪些是5%,哪些是50%...这个貌似复杂了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 10:04:4911楼 得分:1
    静态页面如果有变动的话,就得重新执行一次生成代码,这点比较麻烦,所以我也比较倾向于使用缓存,虽然比较耗内存
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jinzhubaobei
    • 等级:
    发表于:2008-05-03 10:09:1912楼 得分:1
    mark一下

    学习高手之间的对话
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 10:35:3913楼 得分:1

    学习..
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-03 12:00:5714楼 得分:50
    我实际上曾经作为 CMS项目 经理开发过“静态页面”,因此我是根据自己“两方面都做过商品化项目”的实际经验来评估的。

    引用楼主 iuhxq 的帖子:
    另外我有个疑问,用缓存时,如果内存不够了怎么办?是用硬盘存放,还是释放缓存?


    成熟的缓存系统关键就是它会智能地丢弃缓存的内容,而这个“丢弃”的时机是经过千锤百炼,要比你在自己的代码中使用内存方式通常要更适合服务器内存实际情况。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 12:07:0415楼 得分:1
    我觉得静态页面只适合于访问量大,并且静态页面数量小的情况.....
    当一个文件夹下面有几千个静态文件的时候,效率呈级数下降.....
    所谓容易被搜索引擎检索到,动态页面做成伪静态页面也可以的.
    都存到数据库里,用户访问的时候生成静态页,访问静态页的时候通过脚本更新最后访问时间.
    然后用WINDOWS服务来决定哪些访问量小的页面要删除...
    以上为构想,可能不成熟.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-03 12:08:1916楼 得分:1
    至于功能,就更无法比拟了。

    缓存系统的主要特征是提供了各种灵活的Dependecy,不但内存达到一定条件(默认是60%),时间达到一定条件(产生之后的时间、最后访问时间),还可以依赖于文件改变、数据库改变,甚至自己编写缓存依赖条件,这是关键。

    关键是对于交互式网站还需要大量使用“片段缓存”。

    我没有一棍子打死“静态页面”做法,对于很简单的无交互网站当然可以。我要强调的是如果你的handler仍然是asp.net的,网页链接还是asp.net方式的,如果删除网站的asp.net系统之后静态页面就不能从网站上正常导航到了,那种“静态页面”网站相对来说你当初就不应该使用asp.net这种过分高级的工具开发。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-03 12:16:3817楼 得分:1
    引用楼主 iuhxq 的帖子:
    假如有100万个页面,甚至更多,每天,有5%的页面会浏览十次以上,有50%的页面只浏览一次。剩下45%根本没人看过。


    实际上,这正是说明为什么有很多公司使用asp.net原因。asp.net是动态网站生成工具,你越是发掘动态交互网站的能力时(例如用户自己选择theme),你才越是需要asp.net。“100万个页面”其实可能只是从20个aspx中动态产生的。asp.net缓存是内置在动态交互网站上已经成熟的技术,你不需要纠缠于是否需要把整个网站导出以及导出之后带来的一切“动态”问题,直接在asp.net程序本身的优化升级过程中轻松搞定,提高性能的同时没有丧失任何动态特征,在网站性能升级过程中丝毫没有“成事不足败事有余”之感,何乐而不为。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-03 12:35:5418楼 得分:1
    使用asp.net的关键是会设置最恰当的“缓存依赖条件”。我看到很多人仅会设置Duration参数,这可能是“滥用缓存”或者“不用缓存”的原因。要恰好让依赖的数据改变时缓存立刻失效,而依赖的数据没有改变时要千方百计地优先使用缓存,才能提高网站性能。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iuhxq
    • 等级:
    发表于:2008-05-03 13:02:4019楼 得分:0
    谢谢SP1234,看了你的回复受益匪浅,我还是慢慢琢磨琢磨你的回复。呵呵


    其实我很少使用页面缓存,我宁可用静态页面来代替,主要是因为我对缓存依赖没有掌握。至于数据片段缓存这个很简单,而且代码也比较通用。以前一直在用。

    我在想,一个页面可能依赖几个表(数据库),一个表可能被多个页面依赖。也可以说成是多对多的关系。如何让这些改变能立刻生效,需要深入研究才能搞清楚。我目前对这个还是比较模糊。没有成功实现。所以我一直用静态页面的方式。数据改变了,我重新生成(不管是立刻,还是访问时再重新生成,都差不多)


    但是显然用缓存依赖,我也觉得是很好的方案。这点我承认。我也会好好去研究一下。

    刚才你提到,对于不常访问的的页面,让他缓存失效,但是我举的例子里有50%页面可能每天访问一次,这样你要不停的缓存、失效。从逻辑上说,也比较走弯路。不如静态页面,一直放那里好。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • only_endure
    • 等级:
    发表于:2008-05-03 13:24:1720楼 得分:1
    现在书店里的书很肤浅,想学得深入些,有什么好网站可以推荐么?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 13:34:0921楼 得分:1
    引用 3 楼 prewin 的回复:
    以空间换时间的静态页面!
    好题目,关注!


    汗。。。差矣差矣

    网站无非大小(企业和门户)

    企业网站也就几百个页面,一个页面才5-10K,能占多大空间
    门户网站都是用服务器。。
    1G=20万页面,
    1个服务器硬盘知道多大吗??
    你就是有1亿个页面,我也能装得下。。

    我就支持门户用HTML,而且纯HTML!!

    以前我是用ASP写CMS静态生成,现在用.net写!!

    优势大于劣势,打开速度快,利于SEO,门户建议最好用静态生成!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iuhxq
    • 等级:
    发表于:2008-05-03 13:52:4522楼 得分:0
    生成纯静态页面,可以脱离.net运行的网站,维护起来比较麻烦,一个小小的改动,就要整个网站都重新生成。
    需要一个很好的机制才行。
    引用 21 楼 aspnet30 的回复:
    引用 3 楼 prewin 的回复:
    以空间换时间的静态页面! 
    好题目,关注!


    汗。。。差矣差矣

    网站无非大小(企业和门户)

    企业网站也就几百个页面,一个页面才5-10K,能占多大空间
    门户网站都是用服务器。。
    1G=20万页面,
    1个服务器硬盘知道多大吗??
    你就是有1亿个页面,我也能装得下。。

    我就支持门户用HTML,而且纯HTML!!

    以前我是用ASP写CMS静态生成,现在用.net写!!

    优势大于劣势,…
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 15:07:4323楼 得分:1
    其实过多使用asp.net缓存问题相当严重,真正使用过的就会发现它最严重的问题并不在于它的服务器内存
    够不够的问题,这虽然是一个方面,但不是最重要的。
    第一个问题:相当严重的缓存过期问题,改动一个dll,改动下配置文件,改变下code立刻很使所有缓存
    被重置,服务器刚开始本来就需要大量的CPU的时间来对dll进行编译,然后再大量的SQL查询,然后再频繁的
    内存释放和重分配,相当的致命,再之后的相当长时间内服务器会运行迟缓,毕竟所有的缓存都要在遇到
    访问时重新进行SQL查询,然后重新定义。
    第二个问题:服务器缓存的过期问题,页面缓存的过期确实有时候并没有按照预想的时候进行过期,提早的可能性很大,可以声明的事这并不是内存不够的问题。然后就是没有过期的问题,好像感觉上没有可能,
    其实可能性很大,服务器的页面缓存大多数都是进行文件依赖的,这个文件依赖交错错中复杂,确并不是
    100%可靠。
    因此不要过于依赖于asp.net的缓存机制,我宁可你把这种机制建立在第三方的缓存方案上。
    至于做静态页可能遇到相当多的静态页面,其实只要你选择了这种方案,如果是遇到百万级的静态页面,那
    肯定是有相应的机制来控制这种的静态页的生存期,而这种机其实相当简单,这种考虑是多虑了,就如同控制IIS的日志增长一样,谁会放任不管的?

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-03 15:27:4324楼 得分:1
    引用 19 楼 iuhxq 的回复:
    我在想,一个页面可能依赖几个表(数据库),一个表可能被多个页面依赖。也可以说成是多对多的关系。如何让这些改变能立刻生效,需要深入研究才能搞清楚。我目前对这个还是比较模糊。没有成功…


    如果明知道一个页面很少使用,首先是没有必要缓存。

    其实,我从来不用页面缓存,我都是片段缓存的。当然我不反对页面缓存,而是对我来说用户控件才是编程核心,页面都是很简单的,几乎10秒钟创建一个页面,剩下的功夫就是把以前做好的用户控件添加其中并设置它们之间数据协调一致。

    关于数据库表更新问题,可以参考有关页面缓存管理中的SqlDependency资料。

    也可以简单一些。我在那个“如何看你的缓存是否生效”的帖子中写的例子里是根据cookie来刷新缓存,当然你可以改为返回数据表中的某个“时间戳”的值。例如一个“用户订单”的界面(不是指订单细节,而是指订单的头部信息),你在数据库中可以为这个“订单”表增加一个“最后修改时间”字段以及增加一个触发器来产生这个字段值,这样订单界面在用户录入细节内容时它的头部信息部分可以作为一个独立的ascx,当用户编辑订单细节时订单头部实际上并不重建控件。你在订单界面上可以用代码输出订单头部用户控件的对象,你会发现它大多数时候是null,也就是说当编辑订单细节时订单头部控件“根本不存在”,asp.net只是从缓存中拿出html直接输出。既然根本没有重建用户控件,当然不会去读数据库。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-03 15:38:1525楼 得分:1



    老婆,给我拖个马扎来,我要学习了


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-03 15:42:1126楼 得分:1
    引用 19 楼 iuhxq 的回复:
    刚才你提到,对于不常访问的的页面,让他缓存失效,但是我举的例子里有50%页面可能每天访问一次,这样你要不停的缓存、失效。从逻辑上说,也比较走弯路。不如静态页面,一直放那里好。


    一种情况是确实是1个小时也难得有一个访问,可能是根本无需缓存。这类页面即使不缓存,也没有什么损失。

    另一种是你完全可以缓存较长时间,例如缓存1个小时。是不是缓存缓存时间越长就代表优先级越高?显然不是。如果内存不足,任何不常用的东西首先被从内存删除,跟你设置的Duration无关。因此,如果你设置缓存1个小时,然后它被在千分之一秒内被删除了,即使这期间没有一个请求访问过缓存的页面,花费千分之一秒时间代价也无所谓。如果你设置为缓存10秒钟,但是通常在10秒钟内不足够有一个请求访问它,这个代价才不值得缓存。我们可以看见,如果缓存不值得,首先的考虑可以是加大缓存时间,例如从10秒钟变为30秒钟、1分钟、5分钟、20分钟、1小时。当很大的缓存时间还是觉得不值得,才根本取消缓存。如果又希望避免重建控件内容,又害怕“不停的缓存、失效”,这其实是自相矛盾的。关键是:1:设置了缓存时间只是最低级的缓存策略,必须同时配合业务要求来控制缓存及时失效;2: 相信不论你如何设置缓存依赖条件,缓存系统都会优先根据服务器内存使用情况来自己决定是否提前清理缓存的对象,因此尽量使用缓存并不会造成服务器内存实际的故障。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-03 15:43:3327楼 得分:1
    然后它被在千分之一秒内被删除了  -->  然后它在1个小时后某个时间点被asp.net在千分之一秒内删除了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-03 15:55:1228楼 得分:1
    引用 23 楼 zhujiechang 的回复:
    第一个问题:相当严重的缓存过期问题,改动一个dll,改动下配置文件,改变下code立刻很使所有缓存
    被重置,服务器刚开始本来就需要大量的CPU的时间来对dll进行编译,然后再大量的SQL查询,然后再频繁的
    内存释放和重分配,相当的致命,再之后的相当长时间内服务器会运行迟缓,毕竟所有的缓存都要在遇到
    访问时重新进行SQL查询,然后重新定义。


    这其实根本不是缓存过期,而是网站更新,整个进程重新启动。什么时候网站必须更新?如果你生成了一堆静态页面,但是网站必须重新更新,此时那些静态页面能够幸免被重建的命运吗?如果能够幸免,也就无需重新更新网站程序。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-03 15:59:4629楼 得分:1
    引用 23 楼 zhujiechang 的回复:
    第二个问题:服务器缓存的过期问题,页面缓存的过期确实有时候并没有按照预想的时候进行过期,提早的可能性很大,可以声明的事这并不是内存不够的问题。然后就是没有过期的问题,好像感觉上没有可能,
    其实可能性很大,服务器的页面缓存大多数都是进行文件依赖的,这个文件依赖交错错中复杂,确并不是
    100%可靠。


    我最头疼的就是很多人把asp.net的缓存机制说成是“定时保存”对象,这是一种很“坏”的歪曲。Duration时间是我们给缓存一个最低级、最基础的约束,然后我们就必须给它一个业务需要的“适时失效”约束。把缓存理解成为在内存中以一段固定的时间占用内存,这是很偏的,造成了滥用缓存或者不用缓存的结果。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-03 16:07:3830楼 得分:1
    引用 23 楼 zhujiechang 的回复:
    其实可能性很大,服务器的页面缓存大多数都是进行文件依赖的,这个文件依赖交错错中复杂,确并不是
    100%可靠。


    sorry,我记忆中很难想起哪一个是不得不进行文件依赖的!除非逻辑上本来就是依赖这个文件,否则丝毫无需用文件依赖。
    另外,文件依赖仅需要设置一个文件路径字符串而已,并不是错综复杂。真正造成错综复杂的,可能使在逻辑上根本无需文件依赖的时候一定要将许多其它数据改变导成文件依赖这个结果上。这其实查找技术的问题。缓存还是很简单的,只是你找到的资料少,可能不像介绍GridView控件的资料那样地泛滥而已。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • only_endure
    • 等级:
    发表于:2008-05-03 16:11:3331楼 得分:1
    请问sp1234
    如何自已编写缓存依赖条件呢?
    我看到的书上写的是在数据源控件的声明语句里,加上某属性.实现数据依赖(根据数据表格中某个字段或某条记录),是用声明语句写的.很生硬.

    但是对灵活地自己编写就是一点不懂了.看的书太少,没有仔细研究,说错勿怪.呵呵.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    发表于:2008-05-03 16:15:3232楼 得分:1
    除了我的页面都是用户控件组合而成之外(至少我可以在一个页面上仅放一个用户控件,当然至今还不会使用masterpage),不使用页面缓存的理由还包括很重要的:UpdatePanel不支持。这很自然,整个页面缓存了,UpdatePanel的事件就无法触发。

    但是片段缓存完全支持UpdatePanel。
    修改 删除 举报