如何通过id缓存查找对象

时间:2013-03-12 11:25:40

标签: ruby-on-rails hibernate dalli

select * from Foo where id = 200

如何通过id缓存查找对象,因为我们观察到在某个id上始终进行select调用。我们应该如何以非突兀的方式在rails中启用它,以便我们可以在将来的任何缓存存储之间切换(比如memcached或redis)

编辑:

与基于Hibernate的缓存策略org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE非常相似,它适用于Java EE中的所有Entity类。

4 个答案:

答案 0 :(得分: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来设置应用程序的默认缓存存储,例如,config.cache_store = :memory_store link Alex Ghiculescu提供的链接在第2.1节中提供了良好的信息

当您尝试获取cache_store中不存在的密钥时,将自动填充rails缓存存储。因此,为密钥提供良好的命名约定非常重要。一旦建立了基础知识,就可以通过在config/application.rb中进行适当的更改,轻松地在不同的缓存存储之间切换。部分选项包括memory storefile storememcache或缓存存储的任意组合。

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

答案 1 :(得分: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。它是超级测试版,尚未在生产中进行测试,但如果您愿意尝试,请查看回购:https://github.com/johnkoht/cache-money-millionaire并告诉我您的想法。

基本上,如果您致电Post.find(3),它将自动查找并创建缓存密钥为Post 3的缓存版本,该缓存密钥将在保存或触摸时自动更新。就像我说的那样,它是测试版,但它解决了这个问题。

答案 2 :(得分:1)

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

<强> record-cache

支持Rails 3.积极开发。

<强> cache_money

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

答案 3 :(得分:0)

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

它还处于测试阶段,所以要小心使用。它也不会追踪协会。