Rails 低级缓存不缓存

问题描述 投票:0回答:2

我有一个名为 Event 的模型。在事件模型中,我有以下代码:

def self.all_events
    Rails.cache.fetch("events", expires_in: 2.days) do
        Event.all.to_a
    end
end

我在控制器中调用

all_events
方法。如果上面的方法有效,那么服务器日志应该只在第一次调用控制器代码时显示查询,之后每次在接下来的两天里,事件应该作为一个数组存在于内存中——对吗?出于某种原因,服务器日志每次都显示数据库查询。我如何使缓存工作?

ruby-on-rails ruby caching activerecord ruby-on-rails-5
2个回答
0
投票

您必须在两种环境中正确配置缓存设置。

我更喜欢 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


0
投票

检查开发和生产中的缓存配置。在开发中,您必须显式打开缓存(使用

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.

,必须在开发中明确打开缓存
© www.soinside.com 2019 - 2024. All rights reserved.