【问题标题】:Rails low level query cachingRails 低级查询缓存
【发布时间】:2016-08-09 02:28:38
【问题描述】:

我想缓存一个控制器查询结果,因为它是一个非常静态的数据,不会经常变化。

所以我想知道我是否可以定义这个方法:

  def cached_collections
    Rails.cache.fetch('collections', :expires_in => 24.hours) do
      Collection.all
    end
  end

并以某种方式代替使用

@collections = Collection.all

我可以直接调用方法吗?

@collections = cached_collections

这是有效的,但它是正确的方法吗?在使用 Memcached 或 Redis 之前

【问题讨论】:

    标签: ruby-on-rails caching activerecord


    【解决方案1】:

    在您的方法cached_collections 中,您试图缓存一个复杂的对象结构(ActiveRecord::Relation 的一个实例)。这可能是可以实现的,但更简单的方法是只缓存您的视图或视图片段:

    <% cache do %>
      <% @collection.each do |item| %>
        <%# do something with item %>
      <% end %>
    <% end %>
    

    您仍然可以在控制器内部初始化查询,例如:

    @collection = Collection.limit(10)
    

    ActiveRecord::Relation 的实例是惰性的;它们以某种方式模仿数组的行为,在您显式访问获取的结果之前它们不会访问数据库,例如:@collection.first@collection.each{ #... }

    所以只要你的片段被缓存,就没有数据库查询。

    缓存示例请参考:http://guides.rubyonrails.org/caching_with_rails.html

    编辑:

    对于 JSON 请求,您可以这样做:

    @collection = Collection.all
    render :json => Rails.cache.fetch('collections', :expires_in => 24.hours) do
      @collection.to_json
    end
    

    同样,除非您的缓存已过时并且缓存中没有复杂的对象结构,否则不会向数据库发出请求。

    【讨论】:

    • mm 在我的情况下,我没有使用仅发送 JSON 响应 json 的视图:是否仍然可以将其缓存在响应中?
    • 我注意到查询过时时没有更新,这是故意的吗?
    • 似乎expires_in 选项已被弃用,看看这个:stackoverflow.com/questions/6157059/…
    • 谢谢,我去看看
    猜你喜欢
    • 2018-04-04
    • 2017-11-07
    • 2018-04-08
    • 2015-08-24
    • 2015-03-02
    • 2023-04-09
    • 2015-05-25
    • 2013-10-31
    • 2014-11-28
    相关资源
    最近更新 更多