开发可缓存加速的动态页面
为什么需要缓存加速?
目前有很多网站是基于PHP、Java或ASP甚至C等语言开发而成, 但无论使用哪种语言进行开发,都必须跟数据库连接、读取和处理数据然后生成页面内容并输出。而数据库正好就是动态页面的速度瓶颈,对于一个百万级访问量的网站,如果没有缓存加速的设计,无法想象网站数据库的压力是如何之大。每秒上千个数据库连接和处理,该需要什么样的数据库系统才能支撑起来?
只有使用缓存加速的技术,才能有效降低数据库的压力并提高页面处理的效率,从而加快页面打开速度。
缓存加速技术有哪些?
在网站应用的缓存加速技术可以分为三类 :
- 数据缓存在页面中会有很多数据是从数据库中读取的,为降低数据库的数据处理压力,业界已有比较多的解决方案,比如使用 memcache 把一些数据缓存起来,从而降低对数据库的处理压力。或者把数据库的读取和写入分离到多台服务器,并提供多个供读取的数据库进行加速。
- 内容缓存我们可以把一个页面分成几个大的组成部分,并分别把这几个部分的内容缓存起来,使得在下次的访问可以直接在缓存中读取内容,而无需连接数据库和处理结果。比如博客的侧栏,在多个页面的侧栏内容是一样的,那么我们就可以把侧栏的内容缓存起来,当其他页面需要侧栏内容时就可以直接使用缓存数据,加快页面处理的速度。
- 页面缓存直接把页面的内容缓存起来,使得在下次访问可以直接返回缓存的页面内容,而无需连接数据库和处理数据。这是最高效的缓存方式,但要求页面必须是可以公开让多个访客读取的。
我们需要根据网站的各个应用,选择合适的缓存加速技术。对于动态性和私密性要求比较高的页面,显然不适合使用页面缓存技术。
如何开发可缓存加速的动态页面?
要开发一个可缓存加速的页面,首先要解决的问题是私密性。必须把用户私有的内容从页面上剥离出来,才能把页面缓存。
普通网站页面中可能包含的私有信息有:
- 用户帐号名、登录状态
- 与用户相关的提示信息(如短消息通知)
- 用户管理页面的链接(包括权限)
- 发表评论的输入表单
为能够把这些私密性的页面元素剥离出来,我们需要使用 JavaScript + CSS 的技术以实现,也就是大家常说的 AJAX 技术。但并不是全部元素都需要使用 AJAX 来进行剥离,只有私密性高的元素才需要到 AJAX 技术来实现。毕竟使用 AJAX 也是需要付出代价的,多一个元素使用 AJAX 进行剥离,那么就会产生多一个 HTTP 请求。所以我们并不建议大量使用这个技术,应该尽量使用 JavaScript 和 CSS 来实现。
以 Yo2.cn 的主站为例,网站会在浏览器上写入两个 cookie 数据,一个是经过加密的帐号信息,而另一个则是明文的用户信息。因为我们页面上的 JavaScript 通过 cookie 来进行分析处理,但又必须保证用户帐号的安全,所以把一些基本的,并不影响帐号安全性的信息保存成明文格式。而另一个经过加密的 cookie 信息,只有服务器端的程序能够解读,并且也只以经过加密的 cookie 信息作为数据处理的权限验证。从而兼顾到页面静态化与安全性两个方面。
我们把用户的登录链接,发布评论的表单等信息都保存在页面上,并使用 CSS 的 display:none 属性,把这些页面元素隐藏起来。在页面加载完成后通过 JavaScript 读取 cookie 并按需求把这些元素再显示出来给用户。
在 Yo2.cn 主站的开发过程中,我们为这些私有元素定义了 .needlogin、.asklogin和.admin 等几个类别。其中 .needlogin 是指需要用户登录后才需要显示的元素,而 .asklogin 则是用户并没有登录时需要显示的。.admin 就是需要拥有管理权限的用户才需要显示。
而例如短消息通知等需要实时更新的信息,我们则采用 AJAX 的技术实现。当页面加载后,JavaScript 判断是否登录用户访问,如果是登录用户访问才会使用 AJAX 把用户的短消息通知信息调用出来并显示。
我们把页面上的私有元素都经过特殊处理后,页面就可以被公开的静态缓存,最大程度的加快页面处理速度了。
静态缓存的效果如何?
目前在 Yo2.cn 的实际运营中,是使用 yo2cache 系统进行页面的缓存加速,每秒可处理高达 1500 个页面访问。当然大家也可以考虑使用 squid 等反向代理软件实现页面的缓存加速,效率也是很高的 ![]()
Yo2.cn 整个网站,从主站和博客服务都使用了页面缓存加速技术(有小部分属于管理功能的页面不能缓存加速)。页面日访问量高达 200w 以上,但数据中心的服务器每秒需要处理的并发连接只在 30~50 个左右。我们各CDN缓存节点的带宽总和达到 20Mb~30M,而数据中心的带宽只跑到 3~5Mb,也就是说有 90% 左右的访问是直接在缓存节点上直接返回页面数据的。
总结来说,我们应该重视页面静态化缓存,但同样需要兼顾数据缓存和内容缓存。只是静态化缓存带来的效果更加明显 ![]()
快速链接:http://oneoo.com/go/635243.html
十一月 22nd, 2008 at 8:35 上午
很强大
十一月 22nd, 2008 at 11:27 上午
很牛逼很oneoo
十一月 22nd, 2008 at 1:19 下午
很强大,学习了!!
不过对于我们这些小博客好像用不着!
十一月 22nd, 2008 at 11:59 下午
@xiaorsz 这都能学习,只有膜拜的份……
十一月 22nd, 2008 at 6:22 下午
十一月 23rd, 2008 at 9:42 上午
一个字:不懂
十一月 24th, 2008 at 11:04 上午
是的,不懂,太专业了啊
十一月 24th, 2008 at 9:26 下午
Yo2越来越好了!
十一月 25th, 2008 at 1:00 下午
看不懂,不过咱yo2就用这技术,用着好使就好
十一月 28th, 2008 at 12:15 上午
十一月 28th, 2008 at 12:28 上午
突然发现大大的背景音乐居然也是海口,呵呵~
不过正好有个问题,就是这个侧边栏的播放器只支持mp3格式的音乐么?
十一月 29th, 2008 at 11:37 上午
@Dreamix 对,只支持 mp3
十二月 4th, 2008 at 9:28 上午
[...] 12.4补记:yo2的缓存加速做得太彻底啦!只有90% 左右的访问是直接在缓存节点上直接返回页面数据的!“is_user_logged_in()”的概率太小了!没有找到合适的地方使用。把侧栏和页尾的内容关掉缓存加速也显示的不好。 Posted in wordpress by 挑战书 on 11-09-2008. Tags: wordpress, 模板. 相关文章: [...]
十二月 4th, 2008 at 9:12 下午
@WordPress只对你自己显示的内容 高级!这句评论怎么自动跑这来了?!这是什么插件做的?识别能力也太强了吧!
五月 8th, 2009 at 12:54 上午
怎么会有到我的ip?