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

缓存加速的动态页面--指页面内容可以被静态化,可供多个访客读取的。而传统的动巷,用铅笔在城市地图上标出,它们就构成一个字母,准确地说,应该是个倒置的W,首尾两点之间距离没那么均匀分配,中易的痰盂,我经过的时候常看见老人将秽物倒进河水,还在河边冲洗,用刷子擦,坚硬的塑料须擦着金属面,磨出笨拙的窸窣网页并不能直接实现静态化缓存处理,因为当中可能包括了一个用户信息,或与个别用户关联的信息。这些是无法进行公开缓存加速的,本文主要是提供一个开发可公开缓存页面的解决方案   :)

为什么需要缓存加速?

  目前有很多网站是基于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% 左右的访问是直接在缓存节点上直接返回页面数据的。

  总结来说,我们应该重视页面静态化缓存,但同样需要兼顾数据缓存和内容缓存。只是静态化缓存带来的效果更加明显 :)


Rand Posts:

已有 15 条评论发表在文章“开发可缓存加速的动态页面”上

  1. blankyao Says:

    很强大 8)

  2. 胡戈戈 Says:

    很牛逼很oneoo

  3. xiaorsz Says:

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

  4. Fancy Says:

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

  5. 天天小雨 Says:

    :P 不懂~

  6. zylew Says:

    一个字:不懂

  7. wanvee Says:

    是的,不懂,太专业了啊

  8. RDEN Says:

    Yo2越来越好了!

  9. Siuloong Says:

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

  10. Dreamix Says:

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

  11. Dreamix Says:

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

  12. oneoo Says:

    @Dreamix 对,只支持 mp3

  13. WordPress只对你自己显示的内容 Says:

    [...] 12.4补记:yo2的缓存加速做得太彻底啦!只有90% 左右的访问是直接在缓存节点上直接返回页面数据的!“is_user_logged_in()”的概率太小了!没有找到合适的地方使用。把侧栏和页尾的内容关掉缓存加速也显示的不好。 Posted in wordpress by 挑战书 on 11-09-2008. Tags: wordpress, 模板. 相关文章: [...]

  14. 挑战书 Says:

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

  15. 古筝 Says:

    怎么会有到我的ip?

发表评论