摘要:内容管理系统(CMS)在各大商业站点和门户站点中扮演着重要的角色,是内容有效组织和快速发布极为重要的基础平台。目前主流的内容发布系统都使用静态页面进行内容发布,在我们的实际使用过程中我们深切的感受到静态内容发布存在着很多弊端,本文讨论全搜索目前正在使用的基于动态可缓存内容发布系统的考虑和实现。

一、什么是内容管理系统?

内容发布系统也即CMS,英文全称为:Content management system,用于对企业业务数据进行组织、管理和发布,这里的内容不仅仅指文字内容,还包括图片、声音、视频、Flash等富媒体资源,CMS的应用极大的提高了站点的建设效率并降低了维护成本。目前市面上的CMS种类繁多,开源的内容管理系统主要有:

PHP:

国内PHPCMS,VeryCMS,DeDeCMS,EmpireCMS,HBCMS

国外:Mambo,Joomla!,XOOPS,Drupal

更多见:http://www.php-open.com/9.htm

Java见http://www.open-open.com/39.htm

ASP主要考察使用过风讯,对其它ASPCMS感兴趣的可以查看这篇文章

http://hi.baidu.com/liberty88/blog/item/56e147fbd8271a176c22eb0e.html

商业CMS主要有:方正翔宇CMS,北方网CMS和TRS WAS,其中方正翔宇CMS在媒体行业应用非常广泛,TRS在政府部门应用非常广泛,北方网CMS在一些媒体网站中也有些应用。

就目前的总体情况来看,开源类CMS和商业类CMS还存在很大的差距,商业CMS在工作流,权限控制,内容的编采发以及系统的性能,扩展和可维护性上已经非常成熟和完善;对比开源CMS,则在这些方面存在很大的差距。由于个人觉得国外的CMS不太符合国人的使用习惯和国情,所以对他们研究的比较少也不太清楚他们在国内的应用情况,就国内的CMS而言目前也还没有看到较大规模应用的案例(如果有请告诉我),我透露几个目前已知的商业CMS内容发布系统的应用情况关键性能指标,最大数据量千万级,同时最高终端用户数500,发布时间1-2秒,每日更新1万-2万篇内容,相关内容自动更新。总之,开源CMS要走的路还长。

二、什么是动态可缓存的内容管理系统?

动态可缓存的内容管理系统是指前台页面动态解析执行并且动态解析执行的页面可被客户端和代理服务器进行缓存从而达到和生成静态页面同样的执行性能和效果的管理系统。

三、为什么使用动态可缓存的内容管理系统?

第一节面提供的内容发布系统包括商业类CMS基本都是以生成静态页面的方式进行内容发布,我们早期的系统也全部使用静态静态页面进行内容发布,在我们的实际使用过程中,生成静态页面的方式给我们带来了很多麻烦,主要有下面几个问题:

1、在设计、开发上,使用静态页面进行发布,系统需要很多额外的设计和开发,以静态页面的方式进行发布,涉及到生成规则,更新规则,发布规则等方方面面的事务,特别是当系统对内容的发布和更新有苛刻的性能要求时,这些规则更是需要进行仔细的设计和权衡。使用静态页进行发布主要是考虑到系统的执行性能,我当然同意静态页的执行性能是很高的,但是多数系统却远远大不到预想的访问量而引入了高度的系统复杂,也并非是系统一开始就有巨大的访问量,我也不认同动态执行页面就无法承受大访问量的说法,其实我看到的大多数CMS中都没有对静态页的处理规则进行很好的设计,比如:经常是在后台撤销了内容发现原始html没有删除,内容依然可以访问或者一篇内容更新时,相关引用的内容无法做到关联更新;静态发布方式并不是那样容易的,相反我觉得动态发布更容易开发和维护。

2、在系统维护上,生成的静态页面会占用很大的磁盘空间,我们所有的静态页面加起来应该有100-200个G了。这样庞大的数据量备份,恢复都是很麻烦的,无形之中给系统的运维工作增加了很大的难度,但实际上CMS有个显著的特点就是发布多,修改少,越早的数据越少被访问,应该说这100,200个G的数据中有99%以上的数据是有效期过后很少或再也没被访问过的,所以磁盘几乎是白白的被浪费了。

所以,在我们的实际使用过程中我们更倾向于动态内容执行+多重cache的方式,新的系统中我们是这样做的,最后完成的系统非常简单并在Squid的帮助下达到静态页面的执行性能。

四、如何实现动态可缓存的内容管理系统?

(可缓存的内容管理系统用户访问流程)

实现过程:

1. 所有前台页面使用URL rewrite重写成.html进行访问,方便搜索引擎收录。

2. WEB程序执行时,向Squid服务器发送Expires头,用于控制squid服务器的缓存时间。Expires用户设置Squid服务器和客户端的缓存时间。如:

PHP
php代码

header("Expires:" . gmdate("D, d M Y H:i:s", time() + 120). "GMT"); //缓存120秒 

Java

java.text.SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Calendar cal = Calendar.getInstance(new SimpleTimeZone(0, "GMT"));
format.setCalendar(cal);
java.util.Date expires = format.parse(format.format(new Date(System.currentTimeMillis() + 120 * 1000)));
response.setHeader('Expires: ' + expires);
 
 

3. 配置Squid服务器指向源服务器,并配置ignore-reloa来忽略no-cache和reload请求以提升Squid的命中率。

4. 将最新最热的数据缓存到Memcached服务器,减少数据库的查询。

至此整个过程已经完成,早期系统的访问量一般比较小,这时候可直接将WEB服务器对外提供服务,由于CMS所管理内容发布快,修改少的特性,最新最热的内容都将在Memcached中命中;当访问量增加到一定程度的时候就可以在前端加上squid服务器,这样就实现了和静态页面一样的效果,同时也兼备了系统的可维护性和灵活性。我们的全搜索首页,母婴频道,娱乐频道使用这种方法实现获得了很好的效果。

五、扩展

使用squid作为前端时,过期时间的设置就变得非常重要,如果设置得太长用户就很容易看到过期内容,如果设置得太短又降低了命中率不能有效发挥前端缓存的优势。那过期时间应该设置为多长比较合适呢?通常情况下首页的更新频道很高,内容页更新的频率较低,所以首页的过期时间应该设置得短一些,内容页可以设置的长一些。

新浪

新浪首页60秒过期,内容页120秒过期

搜狐

搜狐首页70秒过期,内容页120秒过期

163

163首页80秒过期,内容页120秒过期

经过测试成都全搜索的系统里首页设置60秒过期,内容页设置120秒过期,这样的设置经过长时间的运行没有收到任何编辑和用户的不良使用反馈,这样的设置使得每隔60秒钟首页去原始服务器执行一次;每隔120秒对内容页去原始服务器执行一次。由于后端使用memcached作为缓存,即使是突发流量也可以轻松自如的应对。

学习资料:

http://delicious.com/wuyong/cache

出处:http://www.cnblogs.com/codecrazy/archive/2010/10/15/1851933.html

动态可缓存的内容管理系统(CMS)的更多相关文章

  1. ASP.NET 内容管理系统CMS

    一.Umbraco 项目地址: http://umbraco.org/ Umbraco是一个开放源码的CMS内容管理系统,基于asp.net建立,使用mssql进行存储数据. 使用Umbraco ,设 ...

  2. 开源重磅,java内容管理系统CMS,点击就可以编辑,保存,轻松构建自己的站点

    买的暂时空间不给力.内存不足,老给关闭,先转到京东云上了,免费的,也不知免费多久. 这是地址2  http://java4cms.jd-app.com/index.html 这是地址  http:// ...

  3. Django+MySQL开发项目:内容管理系统cms(一)

    Baker-Miller Pink被科学方法证实可以平静情绪并且抑制食欲的颜色,具有amazing的效果.基百里面说实验结果表明该颜色具有: "a marked effect on lowe ...

  4. 30 个很棒的 PHP 开源 CMS 内容管理系统

    本文汇集了30个优秀的开源CMS建站系统,采用PHP开发.以下列表不分先后顺序. 1. AdaptCMS AdaptCMS Lite 是一个开源的CMS系统,主要特点是易用,而且可以轻松和其他系统接驳 ...

  5. CMS (内容管理系统)

    ylbtech-Miscellaneos:CMS (内容管理系统) CMS是"Content Management System"的缩写,意为"内容管理系统". ...

  6. 10个开源的PHP网站内容管理系统

    1. DEDE -这是一款国内开源的cms,作者是一个个人,能做出如此功能的cms,是相当不错的.2007版功能十分强大,希望能改善之前数据量一大,更新静态页就很慢的缺点.因为开源,有较多的玩家和拥护 ...

  7. 【Web探索之旅】第二部分第三课:框架和内容管理系统

    内容简介 1.第二部分第三课:框架和内容管理系统 2.第二部分第四课预告:数据库   第二部分第三课:框架和内容管理系统 上一课我们介绍了服务器端的编程语言,有PHP,Java,Python,Ruby ...

  8. 贝云cms内容管理系统(thinkphp5.0开源cms管理系统)

    byCms包含文章,图片,下载,视频模型,基于thinkphp5.0.9,可无缝升级至thinkphp.1.0,是一套简单,易用的内容管理系统,旨在帮助开发者节约web应用后台开发时间和精力,以最快的 ...

  9. 项目视频讲解_[HeyJava][尚学堂][CMS文章内容管理系统]

    [HeyJava][尚学堂][CMS文章内容管理系统] http://pan.baidu.com/s/1c0imHrE

随机推荐

  1. NOIP 合唱队形

    描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…, ...

  2. Metasploit 内网渗透篇

    0x01 reverse the shell File 通常做法是使用msfpayload生成一个backdoor.exe然后上传到目标机器执行.本地监听即可获得meterpreter shell. ...

  3. 《Maven实战》第14章 灵活的构建

    面对不同环境的差异能够灵活的构建项目, 操作系统的差异 开发环境.测试环境.产品环境的差异(最常用) 不同客户的差异 Maven中灵活的构建:属性.资源过滤.profile 14.1Maven属性 6 ...

  4. 网易编程题——Fibonacci数列

    题目描述 Fibonacci数列是这样定义的: F[0] = 0 F[1] = 1 for each i ≥ 2: F[i] = F[i-1] + F[i-2] 因此,Fibonacci数列就形如:0 ...

  5. springMVC @ModelAttribute学习

    springMVC @ModelAttribute学习 博客分类: Spring   @ModelAttribute 绑定请求参数到命令对象 @ModelAttribute一个具有如下三个作用: ①绑 ...

  6. jmeter-请求参数化

    新建个scv文件,将我们需要传递的数据写进去(建议用notepad等编辑器,直接用excel转csv格式有可能会出现不能识别参数) 有多个参数用,分开 另存为 2.jmeter 新建请求,选择函数对话 ...

  7. python之websocket

    一.websocket WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实现了浏览器与服务器全双工 ...

  8. 使用mybatis如果类属性名和数据库中的属性名不一样取值就会为null

    使用mybatis时如果类属性名和数据库中的属性名不一样取值就会为null 这是不能再去改变javabean中的属性,只能改变sql语句.语句如下所示: <select id="sel ...

  9. python模块及模块安装

    其实python的模块及模块安装和其他编程语言,如:nodeJs.reactJs的相同,只不过他们使用包管理工具不相同而已,python用pip,而node用npm python 模块 python语 ...

  10. 解决:TypeError: object() takes no parameters

    运行测试用例时发现以下报错 Ran 1 test in 22.505s FAILED (errors=1) Error Traceback (most recent call last): File ...