繁体   English   中英

使用 Redis 存储 Rails session

[英]Store Rails session using Redis

Rails 的默认 session 存储是cookie_store 这使得 session 存储在客户端(如果我错了请纠正我)。

我想更改此默认行为,以便我可以将会话存储到 Redis 数据库中。 我在 Inte.net 上找到的帖子/文章建议设置一个缓存存储以使用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:in `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提供的 session 存储,它是 redis-rails 的一部分,可以单独使用。

所以你应该在你的 Gemfile 中定义:

gem 'redis'
gem 'hiredis' # optional
gem 'redis-actionpack'

在您的环境中,定义缓存和 session 存储(请参阅Rails 指南和 gem redis-rails ):

# 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.parent_name.downcase}_session",
  secure: true

现在您使用 Rails 的缓存存储和 redis-rails 的 session 存储。
会话是命名空间的,或者可以在不同的 redis 实例中。

redis_cache_store是缓存存储,不能直接用作 session 存储。 您必须使用redis_cache_store作为默认cache_store ,然后可以将cache_store用于session_store 像这样的东西

在您的config/application.rb中(阅读此处了解原因)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM