使用 Redis 存储 Rails 会话

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

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

ruby-on-rails session redis
2个回答
2
投票

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

-4
投票

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-storeredis-session-store

© www.soinside.com 2019 - 2024. All rights reserved.