6
select * from Foo where id = 200

How to cache finding object by id, since we observe a select call being made all the time on a certain id. How should we enable this in rails in a non obtrusive fashion, so that we can switch between any cache store in the future (say memcached or redis)

EDIT:

Much similar to Hibernate based caching strategy org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE which is applied on all Entity classes in Java EE.

4

4 回答 4

3

在你的 Foo 模型中,你可能想要这样的东西

class Foo < ActiveRecord::Base

  def self.find_some_foo(foo_id)
    Rails.cache.fetch("foo_#{foo_id}", expires_in: 7.days) do
      begin
        self.where(:id => foo_id)
      rescue Exception => e
        logger.info "Exception fetching Foo ID: #{e.to_s}"
        nil
      end
    end
  end

end

config.cache_store=通过在文件中调用来设置应用程序的默认缓存存储config/application.rb,例如,Alex Ghiculescu 提供config.cache_store = :memory_store链接在第 2.1 节中有很好的信息。

当您尝试获取cache_store中不存在的键时,rails 缓存存储会自动填充。出于这个原因,为您的密钥制定一个好的命名约定很重要。一旦你建立了基础,通过在config/application.rb. 一些选择是内存存储文件存储内存缓存或缓存存储的任意组合。

要刷新 rails 内存缓存,请重新启动您的 rails 服务器。要刷新文件缓存,请键入rake tmp:clear。要刷新内存缓存,请参阅此链接

于 2013-03-28T18:41:32.910 回答
2

您可以简单地使用 rails 的内置缓存

Rails.cache.fetch :cache_id_here, :expires_in => 1.days do
   Model.find(id)
end

:cache_id_here随心所欲地进行更改,并将过期设置为您的偏好。您可以将此缓存与 memcached 或您想要的任何替代缓存存储一起使用。您只需在应用程序配置中进行设置。

更新

我正在开发一个通过扩展 Rail 的 .find 和 .save 方法以及缓存结果来解决这个问题的 gem。它是超级测试版,尚未在生产中进行测试,但如果您愿意尝试,请查看 repo:https ://github.com/johnkoht/cache-money-millionaire并告诉我您的想法。

本质上,如果您调用Post.find(3)它,它将自动查找并创建一个缓存版本,其缓存键Post 3将在保存或触摸时自动更新。就像我说的,它是测试版,但它解决了问题。

于 2013-03-26T15:53:01.397 回答
1

以下 gem 提供直写缓存功能:

记录缓存

支持 Rails 3。积极开发。

缓存钱

由 Twitter 构建,现在由社区维护。我不知道它是否支持 Rails 3。

于 2013-03-24T17:12:54.527 回答
0

身份图可以提供帮助:http ://api.rubyonrails.org/classes/ActiveRecord/IdentityMap.html

它仍处于测试阶段,因此请小心使用。它也不会跟踪关联。

于 2013-03-31T08:54:03.870 回答