select * from Foo where id = 200
如何通过id缓存查找对象,因为我们观察到在某个id上始终进行select调用。我们应该如何以非突兀的方式在rails中启用它,以便我们可以在将来的任何缓存存储之间切换(比如memcached或redis)
编辑:
与基于Hibernate的缓存策略org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE
非常相似,它适用于Java EE中的所有Entity类。
答案 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 store,file store,memcache或缓存存储的任意组合。
要刷新内存缓存中的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
它还处于测试阶段,所以要小心使用。它也不会追踪协会。