开发可缓存加速的动态页面

  可缓存加速的动态页面–指页面内容可以被静态化,可供多个访客读取的。而传统的动态网页并不能直接实现静态化缓存处理,因为当中可能包括了一个用户信息,或与个别用户关联的信息。这些是无法进行公开缓存加速的,本文主要是提供一个开发可公开缓存页面的解决方案  :)

为什么需要缓存加速?

  目前有很多网站是基于PHP、Java或ASP甚至C等语言开发而成, 但无论使用哪种语言进行开发,都必须跟数据库连接、读取和处理数据然后生成页面内容并输出。而数据库正好就是动态页面的速度瓶颈,对于一个百万级访问量的网站,如果没有缓存加速的设计,无法想象网站数据库的压力是如何之大。每秒上千个数据库连接和处理,该需要什么样的数据库系统才能支撑起来?

  只有使用缓存加速的技术,才能有效降低数据库的压力并提高页面处理的效率,从而加快页面打开速度。

缓存加速技术有哪些?

  在网站应用的缓存加速技术可以分为三类 :

  1. 数据缓存在页面中会有很多数据是从数据库中读取的,为降低数据库的数据处理压力,业界已有比较多的解决方案,比如使用 memcache 把一些数据缓存起来,从而降低对数据库的处理压力。或者把数据库的读取和写入分离到多台服务器,并提供多个供读取的数据库进行加速。
  2. 内容缓存我们可以把一个页面分成几个大的组成部分,并分别把这几个部分的内容缓存起来,使得在下次的访问可以直接在缓存中读取内容,而无需连接数据库和处理结果。比如博客的侧栏,在多个页面的侧栏内容是一样的,那么我们就可以把侧栏的内容缓存起来,当其他页面需要侧栏内容时就可以直接使用缓存数据,加快页面处理的速度。
  3. 页面缓存直接把页面的内容缓存起来,使得在下次访问可以直接返回缓存的页面内容,而无需连接数据库和处理数据。这是最高效的缓存方式,但要求页面必须是可以公开让多个访客读取的。

  我们需要根据网站的各个应用,选择合适的缓存加速技术。对于动态性和私密性要求比较高的页面,显然不适合使用页面缓存技术。

如何开发可缓存加速的动态页面?

  要开发一个可缓存加速的页面,首先要解决的问题是私密性。必须把用户私有的内容从页面上剥离出来,才能把页面缓存。

普通网站页面中可能包含的私有信息有:

  1. 用户帐号名、登录状态
  2. 与用户相关的提示信息(如短消息通知)
  3. 用户管理页面的链接(包括权限)
  4. 发表评论的输入表单

  为能够把这些私密性的页面元素剥离出来,我们需要使用 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://www.blankyao.cn blankyao

    很强大 8)

  • http://hugege.com 胡戈戈

    很牛逼很oneoo

  • http://www.xiaorsz.cn xiaorsz

    很强大,学习了!!
    不过对于我们这些小博客好像用不着!

    • http://bbs.yo2.cn Fancy

      @xiaorsz 这都能学习,只有膜拜的份……

  • http://www.tianliang.org 天天小雨

    :P 不懂~

  • http://www.liuzhenyun.com zylew

    一个字:不懂

  • http://www.wanvee.net.cn wanvee

    是的,不懂,太专业了啊

  • http://i-ox.cn RDEN

    Yo2越来越好了!

  • http://www.zijile.com Siuloong

    看不懂,不过咱yo2就用这技术,用着好使就好

  • http://www.dreamix.cn Dreamix

    :P 大大真的很棒,在这里还是要感谢你的帮助~

  • http://www.dreamix.cn Dreamix

    突然发现大大的背景音乐居然也是海口,呵呵~
    不过正好有个问题,就是这个侧边栏的播放器只支持mp3格式的音乐么?

    • oneoo

      @Dreamix 对,只支持 mp3

  • Pingback: WordPress只对你自己显示的内容

    • http://www.tiaozhanshu.net 挑战书

      @WordPress只对你自己显示的内容 高级!这句评论怎么自动跑这来了?!这是什么插件做的?识别能力也太强了吧!

  • http://0372.yo2.cn 古筝

    怎么会有到我的ip?

  • Pingback: WordPress只对你自己显示的内容 | Jian Zhou