Rails Cache

April 13, 2013 18:58


以前写代码一般没怎么管性能问题,慢点的也就是报表什么的,那也是几秒钟的事了, 因为数据量不多,呵呵

就在前些天,终于出问题了,数据也就几千条吧,API要把所有数据都取过去, (没办法,这个蛋疼的方式我无力吐槽了,还好数据目前也就几千条,几年后也就万把条吧。。) 由于在数据库里的树结构里面查找,自然有了递归,恩用了一两秒的样子, 其实以前就是调用别人的查找方法一层层找。。懒的再动了,现在又改为先找到下一级的ID, 再用下一级的ID找到下下一级的ID,这样一直找,快了不少

然后再来个cache_action:

caches_action :index, {
  :expires_in => 5.minutes,
  :cache_path => Proc.new {
    {
      :xxx => params[:xxx],
      :role => current_user.role
    }
  }
}

缓存之后确实快了,不过等5分钟一过,重新取的时候还是超慢,10几秒, 这是什么情况?看了下log,发现rendered了N次,数据也查找了N次, 一想,呃,原来我把数据渲染成json时,每条数据里还有查找,如 article.user.name,其实保存的只是一个user_id要找到发文章的用户名, 就不得不一条条的再去查找了,或是改数据结构

改数据结构?还是算了,于是再来FragmentCache,缓存每条记录的片段, 我用的是jbuilder模板:

json.items @items do |item|
  json.cache! {:id => item.id, :updated_at => item.updated} do
    json.partial! item
  end
end

这样,只要这条数据没变化,就一直从缓存里取结果了,呃,其实那个updatedat 应该是过期时间,如果updatedat变了就过期然后重新生成

然后再刷一下api,然后就是ActionCache过期了再取,速度也由十多秒变为了一秒了, 然后准备收工。。

如果不用走controller中的filter,就可以直接用PageCache了,这样都不用走Rails了, 直接返回页面,速度也更快

资料来自 Caching with Rails: An overview 里面还说了SQL Cache

Comments: