极客快报 是我按agile开发的方法几天搞出来的一个RoR网站, 上线一个月, 虽说中间慢慢有添加一些小功能和改进, 但一直对速度和性能上没过多考虑, 目前为止, 文章抓了1300多篇, 日访问量有200-300 UV, 如果用纯动态执行,现在首页访问速度需要200ms, 可以适当的做点小优化了
1. 切表
在网站制作 初期,我们会很习惯的把"文章"这个Model定义成这样:
Post guid:string, title:string, body:text, status:integer
这样做的问题是body是个大文字段,在行数增多的时候,读写会变得很慢,
另外, 在首页列出文章标题, 后台FeedFetcher 抓文章比较已有文章时, 我们是不需要 post.body的, 另外,现在对于文章我们不做真删除,只是把status列标记为删除. 这样更增加了数据的冗余.
所以, 我们的做法是把 post表分成两个, 一个只放 guid, title, status, 叫PostMeta. 另一个为了保持数据的一致性,保持和原来一样, 还是Post
这个URL是解释为什么要分表,而不是在post上做个view http://www.mysqlperformanceblog.com/2007/08/12/mysql-view-as-performance-troublemaker/
这样,在需要文章标题, guid, 判断是否被删除的时候,我们只要访问PostMeta就可以了, 而Post里只放真正发表了的文章, 而且只会在需要显示正文的情况下用到.
2. Cache
因为考虑到极客快报更偏向一个内容阅读类网站,和用户的交互其实并没有很复杂而且很多, 暂时我只是先用Ruby On Rails自带的caches_action只对Post和Comment做页面缓存
这里需要注意几个地方
首先, action_cache会把域名存进路径,所以它认为 www.rmatech.com 和rmatech.com 是两个地方, 存成两套cache,
解决办法, 在前段服务器 lighttpd 把 www.rmatech.com redirect 到 rmatech.com 就可以了, redirect 的代码就在lighttpd 默认配置的注释里.
第二, Ruby on Rails的prloduction 是每个应用进程一个独立的 cache空间, 这样对一个lighttpd 后面跑着几个RoR应用进程的架构来讲,每个进程间的cache不同步.
所以你需要把他们设成一个统一的cache空间. 在config/environments/production.rb对config.cache_store设置
配置教程在 http://guides.rubyonrails.org/caching_with_rails.html
对于大的应用,用的比较多的是memcached, 对于我目前来将, 用本地文件来缓存就已经可以了
第三:
默认的action_cache 没有聪明到认为 /posts 和 /posts?page=2 是两个不同的分页页面, 所以用户点下一页,出来的还是同一个cache 页面. -_-b
所以我需要自己设置 caches_action, :cache_path 这个参数, 定义自己的cache 路径名, 把带page参数页面存成另一个cache页面
第四:
在expire 页面的时候, 分页会变的很恶心,这就想要在数组的第一个位置insert一个新的值,后面的item都要顺着挪一位. 所以每当有一个新文章发表, 我需要把 分页2, 分页3...的cahce页都expire掉.
总结:
加了cache之后, 除了用户评论,赞,编辑人员发布新文章,页面需要重新运算,但这部分对于目前极地快报来讲,只是很小的一部分操作, 一般用户的访问基本都是在cache页上, 只需要2-3ms, 短期之内应该够用了.
1. 切表
在网站制作 初期,我们会很习惯的把"文章"这个Model定义成这样:
Post guid:string, title:string, body:text, status:integer
这样做的问题是body是个大文字段,在行数增多的时候,读写会变得很慢,
另外, 在首页列出文章标题, 后台FeedFetcher 抓文章比较已有文章时, 我们是不需要 post.body的, 另外,现在对于文章我们不做真删除,只是把status列标记为删除. 这样更增加了数据的冗余.
所以, 我们的做法是把 post表分成两个, 一个只放 guid, title, status, 叫PostMeta. 另一个为了保持数据的一致性,保持和原来一样, 还是Post
这个URL是解释为什么要分表,而不是在post上做个view http://www.mysqlperformanceblog.com/2007/08/12/mysql-view-as-performance-troublemaker/
这样,在需要文章标题, guid, 判断是否被删除的时候,我们只要访问PostMeta就可以了, 而Post里只放真正发表了的文章, 而且只会在需要显示正文的情况下用到.
2. Cache
因为考虑到极客快报更偏向一个内容阅读类网站,和用户的交互其实并没有很复杂而且很多, 暂时我只是先用Ruby On Rails自带的caches_action只对Post和Comment做页面缓存
这里需要注意几个地方
首先, action_cache会把域名存进路径,所以它认为 www.rmatech.com 和rmatech.com 是两个地方, 存成两套cache,
解决办法, 在前段服务器 lighttpd 把 www.rmatech.com redirect 到 rmatech.com 就可以了, redirect 的代码就在lighttpd 默认配置的注释里.
第二, Ruby on Rails的prloduction 是每个应用进程一个独立的 cache空间, 这样对一个lighttpd 后面跑着几个RoR应用进程的架构来讲,每个进程间的cache不同步.
所以你需要把他们设成一个统一的cache空间. 在config/environments/production.rb对config.cache_store设置
配置教程在 http://guides.rubyonrails.org/caching_with_rails.html
对于大的应用,用的比较多的是memcached, 对于我目前来将, 用本地文件来缓存就已经可以了
第三:
默认的action_cache 没有聪明到认为 /posts 和 /posts?page=2 是两个不同的分页页面, 所以用户点下一页,出来的还是同一个cache 页面. -_-b
所以我需要自己设置 caches_action, :cache_path 这个参数, 定义自己的cache 路径名, 把带page参数页面存成另一个cache页面
第四:
在expire 页面的时候, 分页会变的很恶心,这就想要在数组的第一个位置insert一个新的值,后面的item都要顺着挪一位. 所以每当有一个新文章发表, 我需要把 分页2, 分页3...的cahce页都expire掉.
总结:
加了cache之后, 除了用户评论,赞,编辑人员发布新文章,页面需要重新运算,但这部分对于目前极地快报来讲,只是很小的一部分操作, 一般用户的访问基本都是在cache页上, 只需要2-3ms, 短期之内应该够用了.