[英]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-store和redis-session-store
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.