Ruby on rails 如何启用模型数据的缓存?

Ruby on rails 如何启用模型数据的缓存?,ruby-on-rails,postgresql,ruby-on-rails-4,caching,model,Ruby On Rails,Postgresql,Ruby On Rails 4,Caching,Model,如何跨请求/操作启用缓存 我的堆栈: 轨道4.2.7 博士后9.5 我在Rails日志中注意到以下内容 Country Load (0.4ms) SELECT "countries".* FROM "countries" WHERE "countries"."iso" = $1 LIMIT 1 [["iso", "US"]] State Load (1.4ms) SELECT "states".* FROM "states" WHERE "states"."iso" = $

如何跨请求/操作启用缓存

我的堆栈:

  • 轨道4.2.7
  • 博士后9.5
我在Rails日志中注意到以下内容

  Country Load (0.4ms)  SELECT  "countries".* FROM "countries" WHERE "countries"."iso" = $1 LIMIT 1  [["iso", "US"]]
  State Load (1.4ms)  SELECT  "states".* FROM "states" WHERE "states"."iso" = $1 AND "states"."country_id" = $2 LIMIT 1  [["iso", "OH"], ["country_id", 233]]
  Country Load (0.3ms)  SELECT  "countries".* FROM "countries" WHERE "countries"."iso" = $1 LIMIT 1  [["iso", "US"]]
  State Load (1.1ms)  SELECT  "states".* FROM "states" WHERE "states"."iso" = $1 AND "states"."country_id" = $2 LIMIT 1  [["iso", "OH"], ["country_id", 233]]
  Country Load (3.6ms)  SELECT  "countries".* FROM "countries" WHERE "countries"."iso" = $1 LIMIT 1  [["iso", "US"]]
  State Load (1.2ms)  SELECT  "states".* FROM "states" WHERE "states"."iso" = $1 AND "states"."country_id" = $2 LIMIT 1  [["iso", "OH"], ["country_id", 233]]
请注意,对我的数据库快速连续地多次运行相同的查询。我是否可以通过某种方式向Rails表明某些表/模型不太可能更改,因此某些查找可以缓存在应用服务器上

我是否可以通过某种方式向Rails表明某些表/模型 不太可能更改,因此可以缓存某些查找 应用服务器

当然,模型缓存似乎非常适合这里

这将为您提供设置不同类型缓存的良好概述

另外,请查看缓存

基本上,您需要研究模型缓存

您可以编写扩展并在要缓存的模型中使用它:

module ModelCachingExtention
  extend ActiveSupport::Concern

  included do
    class << self
      # The first time you call Model.all_cached it will cache the collection,
      # each consequent call will not fire the DB query
      def all_cached
        Rails.cache.fetch(['cached_', name.underscore.to_s, 's']) { all.load }
      end
    end

    after_commit :clear_cache

    private

    # Making sure, that data is in consistent state by removing the cache
    # everytime, the table is touched (eg some record is edited/created/destroyed etc).
    def clear_cache
      Rails.cache.delete(['cached_', self.class.name.underscore.to_s, 's'])
    end
  end
end
modulemodelcachingextention
扩展ActiveSupport::关注点
包括做

类在单个请求中,Rails已经缓存了查询。您将在日志文件中看到它,前缀为
CACHE
。某些操作,如在请求中插入新记录,会导致
清除\u查询\u缓存
,并且所有缓存项都会消失

如果希望查询缓存具有更长的生命周期,则必须自己完成。您可以为此使用Rails缓存功能:

Rails.cache.fetch("countries iso: #{iso}", expires_in: 1.hour) do
  Country.where(iso: iso).all
end
您也可以使用memcache。使用memcache,您可以在多台服务器之间共享缓存的数据。 您必须在特定的环境配置中进行设置


config.cache\u store=:mem\u cache\u store,“cache-1.example.com”、“cache-2.example.com”

我在日志文件中没有看到任何包含“cache”一词的行。我在Mac El Capitan机器上以开发模式运行,因此可能需要启用其他设置,但我不认为正在使用缓存,否则为什么要对数据库执行查询。此缓存仅在启用控制器操作的范围内。尝试在一个操作中多次调用
Country.all;国家/地区。所有
然后您应该首先看到
国家/地区加载
,然后是
缓存
。如果没有,请检查
config.cache\u store
的设置。我已经更新了我的问题,以反映出我对缓存的兴趣超出了单个操作。我的问题是在应用程序的生命周期中更广泛地缓存只读数据,然后看看@Andrey Deineko的awnser和Rails缓存指南
@data=Rails.cache.fetch(“您的完美缓存密钥”,将在1小时后过期){fetch\u what\u ever\u your\u想要()}
是密钥。在开发模式中,您必须启用这种缓存。因此,我正确地理解您,缓存查询的唯一方法是编写一个新方法(例如“按缓存的id查找”),然后在整个应用程序中更改我的索引职业以使用新的查询。“你是这么说的吗?”戴夫,就像我说的,做事的方法总是少之又少。这是最小化数据库查询的方法之一。你可以查看我提供的链接+。但使用上述方法——事实上,您必须在应用程序之间更改调用。默认情况下,Rails已经完成了一些缓存。您发布的链接sitepoint.com站点不处理查询缓存,但您在回答中给出的一个例外(它更多地讨论了页面缓存)。我将查看您的Railscast。@Dave毕竟,这都是数据缓存,是的,链接更多地是关于缓存类型的,可能是我在提供时使用的措辞不准确。至于railscast,我希望它是我的:)
Rails.cache.fetch("countries iso: #{iso}", expires_in: 1.hour) do
  Country.where(iso: iso).all
end