Ruby on Rails小网站性能优化第一步

极客快报 是我按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, 短期之内应该够用了.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值