7

我在控制器中设置了这两个变量。我如何缓存这些,这样它们就不会每次都与数据库通信,只有第一次。

@tablenutrients = Nutrient.find(:all)
@columnnutrients = @tablenutrients.collect {|x| x.nutrient}
4

3 回答 3

14

@djlumley 说了什么。

通常,您还可以配置和使用ActiveSupport::Cache::Store来显式存储您自己的自定义变量。然后,您可以获取/设置缓存值,例如,如下所示:

@tablenutrients = Rails.cache.fetch("tablenutrients") do 
  Nutrient.find(:all)
end
于 2012-10-04T00:49:09.253 回答
3

如果您的数据库设置正确,它应该默认缓存您的数据。如果您使用的是 MySQL 或 postgresql,您可以更改缓存使用的 RAM 数量,以确保您获得高缓存命中率。

除了简单的数据库缓存之外,使用Dalli 之类的东西连接到 memcached 应该可以相当容易地提高性能。

如果设置正确,Rails 应该利用 memcached 将所有活动记录查询缓存在 memcached 中。关于缓存的Rails 指南和Dalli 文档应该可以帮助您根据正在运行的 Rails 版本开始。

于 2012-10-04T00:42:55.803 回答
3

Rails 为您提供了一些内置缓存选项,其中两个可能对您有用,具体取决于您对查询结果所做的操作:

片段缓存

如果您将其用作选择框的集合,这是一种常用的表单,我会选择此选项。这将使您不仅可以缓存数据库结果,还可以缓存页面的实际 HTML 部分。只需<%= cache do %>在该部分周围添加 a 即可完成,如下所示:

<html>
   ...
   <body>
     ...
     <div class='content'>
       ...
       <%= cache do %>
         <%= select "nutrient", "nutrient", Nutrient.all.collect(&:nutrient) } %>
       <% end %>

铁路缓存

您还可以编写一个方法来直接与内置缓存存储对话,方法是在ApplicationController中删除一个方法,然后让它在before_filter回调上运行,如下所示:

application_controller.rb

class ApplicationController < ActionController::Base
  before_filter :retrieve_nutrients

  def retrieve_nutrients
    @nutrients = Rails.cache.fetch("nutrients") do
      Nutrient.all.collect(&:nutrient)
    end
  end
end

在生产环境中的这两种情况下,您都需要设置 Memcached 或 Redis 来充当缓存层(它们位于 Rails.cache 后面并且很容易实现)。我会查看Rails Guides以更深入地了解它。

于 2012-10-04T00:59:48.133 回答