Rails 的默认会话存储是
cookie_store
。这使得会话存储在客户端(如果我错了,请纠正我)。
我想更改此默认行为,以便可以将会话存储到 Redis 数据库中。 我在互联网上找到的帖子/文章建议设置一个缓存存储来使用
redis_cache_store
,然后对于session_store,使用cache_store
。
据我所知,这意味着缓存和会话将使用相同的数据库(实例)。我不想那样。我希望会话和缓存都使用不同的 Redis 实例,因此可以相应地配置它们。
我尝试创建一个初始化文件
config/initializers/session_store.rb
,其中包含以下内容:
Rails.application.config.session_store :redis_cache_store, key: '_my_app_session'
但这不起作用。它给了我以下错误:
/application/configuration.rb:324:在`const_get'中:未初始化的常量ActionDispatch::Session::RedisCacheStore(NameError)
我也发现了这个 gem
https://github.com/redis-store/redis-store
,但我不确定使用这个 gem 会有多大问题,因为 Rails 已经有一个内置的 Redis 缓存存储(https://github.com/rails/rails/pull/31134 )
如 redis-rails 中所述,从 Rails 5.2 开始,Rails 具有开箱即用的 redis 缓存存储。
建议使用此存储进行缓存(片段缓存)。
对于会话,您仍然可以使用redis-actionpack提供的会话存储,它是redis-rails的一部分,可以单独使用。
所以你应该在 Gemfile 中定义:
gem 'redis'
gem 'hiredis' # optional
gem 'redis-actionpack'
在您的环境中,为 Rail 6 及更高版本定义缓存和会话存储(请参阅 Rails Guide 和 gem redis-rails)(感谢 @daveomcd):
# config/environments/production.rb
config.cache_store = :redis_cache_store, { url: ENV['REDIS_URL'] }
config.session_store :redis_store,
servers: ["#{ENV['REDIS_URL']}/session"],
expire_after: 90.minutes,
key: "_#{Rails.application.class.module_parent_name.downcase}_session",
secure: true
现在您正在使用 Rails 的缓存存储和 redis-rails 的会话存储。
会话是命名空间的,也可以位于不同的 Redis 实例中。
6 点之前的轨道:
在 Rails 6 之前,应用程序的名称(在 key 中使用)是由
派生的Rails.application.class.parent_name.downcase
redis_cache_store
是一个缓存存储,你不能直接将它用作会话存储。您必须使用 redis_cache_store
作为默认 cache_store
,然后您可以使用 cache_store
作为您的 session_store
。像这样的东西
在您的
config/application.rb
(阅读this以了解原因)
config.cache_store = :redis_cache_store, options
然后在你的
config/initializers/session_store.rb
Rails.application.config.session_store = :cache_store, key: '_app_session_key'
还有其他选项可以在不修改
cache_store
的情况下执行此操作,例如 redis-store 和 redis-session-store