我有一个名为 Event 的模型。在事件模型中,我有以下代码:
def self.all_events
Rails.cache.fetch("events", expires_in: 2.days) do
Event.all.to_a
end
end
我在控制器中调用
all_events
方法。如果上面的方法有效,那么服务器日志应该只在第一次调用控制器代码时显示查询,之后每次在接下来的两天里,事件应该作为一个数组存在于内存中——对吗?出于某种原因,服务器日志每次都显示数据库查询。我如何使缓存工作?
您必须在两种环境中正确配置缓存设置。
我更喜欢 Redis 作为 Heroku 上的生产环境。您可以在开发环境中使用 memory_store 或 file_store 选项。 https://elements.heroku.com/addons/heroku-redis
宝石文件
gem 'redis-rails'
config/environments/production.rb
Rails.application.configure do
config.action_controller.perform_caching = true
config.cache_store = :redis_store
end
config/environments/development.rb
Rails.application.configure do
config.action_controller.perform_caching = true
config.cache_store = :memory_store
end
您可以在那里找到有关在 Ruby on Rails 上缓存的更多详细信息; http://guides.rubyonrails.org/caching_with_rails.html
检查开发和生产中的缓存配置。在开发中,您必须显式打开缓存(使用
rails dev:cache
或 touch tmp/caching-dev.txt
并重新启动您的开发服务器)。
注意development.rb中的缓存配置,
# Enable/disable caching. By default caching is disabled.
# Run rails dev:cache to toggle caching.
if Rails.root.join("tmp/caching-dev.txt").exist?
config.action_controller.perform_caching = true
config.action_controller.enable_fragment_cache_logging = true
config.cache_store = :memory_store
config.public_file_server.headers = {
"Cache-Control" => "public, max-age=#{2.days.to_i}"
}
else
config.action_controller.perform_caching = false
config.cache_store = :null_store
end
默认情况下,开发缓存是关闭的。根据文档Caching with Rails: An Overview.
,必须在开发中明确打开缓存