ruby on rails-在初始化器中设置cache_store



我正在尝试使用redis存储作为我的Rails3cache_store。我还有一个初始化器/app_config.rb,它加载一个用于配置设置的yaml文件。在我的initializer/redis.rb中,我有:

MyApp::Application.config.cache_store = :redis_store, APP_CONFIG['redis'] 

然而,这似乎并不奏效。如果我这样做:

Rails.cache

在我的rails控制台中,我可以清楚地看到它正在使用

ActiveSupport.Cache.FileStore

作为缓存存储,而不是redis存储。但是,如果我在application.rb文件中添加配置,如下所示:

config.cache_store = :redis_store 

它运行得很好,只是应用程序配置初始值设定项是在application.rb之后加载的,所以我没有访问app_config的权限。

有人经历过这种情况吗?我似乎无法在初始化器中设置缓存存储。

经过一些研究,一个可能的解释是initialize_cache初始化器在rails/initializer之前运行。因此,如果它没有在执行链的早期定义,那么就不会设置缓存存储。你必须在链的早期配置它,比如在application.rb或environments/production.rb 中

我的解决方案是在应用程序配置如下之前移动APP_CONFIG加载:

APP_CONFIG = YAML.load_file(File.expand_path('../config.yml', __FILE__))[Rails.env]

然后在同一个文件中:

config.cache_store = :redis_store, APP_CONFIG['redis']

另一种选择是将cache_store放在before_configuration块中,类似于以下内容:

config.before_configuration do
  APP_CONFIG = YAML.load_file(File.expand_path('../config.yml', __FILE__))[Rails.env]
  config.cache_store = :redis_store, APP_CONFIG['redis']
end

config/initializersRails.cache初始化之后运行,但在config/application.rbconfig/environments之后运行。

config/application.rb或环境中的配置

因此,一种解决方案是在config/application.rbconfig/environments/*.rb中配置高速缓存。

config/initializers/cache.rb中的配置

如果有意在初始化器中配置缓存,可以在配置后手动设置Rails.cache

# config/initializers/cache.rb
Rails.application.config.cache_store = :redis_store, APP_CONFIG['redis']
# Make sure to add this line (http://stackoverflow.com/a/38619281/2066546):
Rails.cache = ActiveSupport::Cache.lookup_store(Rails.application.config.cache_store)

添加等级库

为了确保它有效,添加一个这样的规范:

# spec/features/smoke_spec.rb
require 'spec_helper'
feature "Smoke test" do
  scenario "Testing the rails cache" do
    Rails.cache.write "foo", "bar"
    expect(Rails.cache.read("foo")).to eq "bar"
    expect(Rails.cache).to be_kind_of ActiveSupport::Cache::RedisStore
  end
end

进一步信息

  • Rails.cache是在应用程序引导过程中设置的:https://github.com/rails/rails/blob/5-0-stable/railties/lib/rails/application/bootstrap.rb#L62L70.redis存储不响应:middleware。因此,我们可以省去额外的线路
  • 另请参阅:https://github.com/rails/rails/issues/10908#issuecomment-19281765
  • http://guides.rubyonrails.org/caching_with_rails.html#cache-商店

我尝试了以下操作,结果成功了。

MyApp::Application.config.cache_store = :redis_store
self.class.send :remove_const, :RAILS_CACHE if self.class.const_defined? :RAILS_CACHE
RAILS_CACHE = ActiveSupport::Cache.lookup_store(MyApp::Application.config.cache_store)

在最初的设置中,如果您更改,会有帮助吗

MyApp::Application.config.cache_store = :redis_store, APP_CONFIG['redis'] 

至:

MyApp::Application.config.cache_store = :redis_store, APP_CONFIG['redis'] 
RAILS_CACHE = MyApp::Application.config.cache_store

也有同样的问题,将RAILS_CACHE设置为MyApp::Application.config.cache_store也解决了这个问题。

在初始值设定项中

REDIS ||= Rails.configuration.redis_client

在应用程序.rb

config.redis_client = Redis.new({
  :host => ENV["REDIS_HOST"], 
  :port => ENV["REDIS_PORT"],
  :db => ENV["REDIS_DB"].to_i,
})
config.cache_store = :redis_store, { client: config.redis_client }

相关内容

  • 没有找到相关文章

最新更新