升级到 Rails 5.2 时保留现有会话(使用 Redis 会话存储)
Keeping Existing Sessions When Upgrading to Rails 5.2 (with Redis Session Store)
我最近完成了一个 Rails 应用程序的大升级。我将 App 从 Rails 4.2.8
递增到 Rails 5.2.3
。一切都很顺利,我们所有的自动化测试都通过了,我们已经开始了用户验收测试。
到目前为止,唯一发现的问题是登录用户正在通过此升级注销。我们之前安装了 redis-rails
gem(版本 4.0.0
),以便为我们的 session_store
使用 Redis,现在我们使用 [=] 附带的内置 Redis 存储=16=].
我将我们的配置设置为使用与以前相同的 Redis 连接和相同的 session_store 键值,但我不明白为什么会话仍在重置。似乎 redis-rails 4.0.0
没有正确设置 session_store 键值?
从 redis-rails
升级到 Rails 5.2
时,有没有其他人处理过这个问题并成功保留了现有会话?
编辑:
已更新的其他可能相关的 gem 包括 ruby 2.3.4 => 2.5.5
、devise 4.0.3 => 4.6.2
和 redis 3.2.2 => 4.1.2
我想通了!我认为 session_store
配置的 key
参数应该设置 Redis 键值。此参数实际上用于用户浏览器 cookie 密钥。我所做的升级 did 向会话存储值添加了一个新的 Redis 键,但看起来没有任何参数可以更改或删除这个新的 Redis 键。
我的解决方案是使用脚本重命名我的所有 Redis 会话密钥以匹配新格式(我使用 'namespace' 作为 Redis 缓存存储命名空间):
redis-cli --scan --pattern "namespace:*" | \
awk '/^/ {new_key=;gsub(/namespace:/,"namespace:_session_id:", new_key); printf "*3\r\n\r\nrename\r\n$" length() "\r\n" "\r\n$" length(new_key) "\r\n" new_key "\r\n";}' | \
redis-cli --pipe
最终相关配置为:
config.cache_store = :redis_cache_store, { url: ENV['REDIS_URL'], namespace: 'namespace' }
config.session_store :cache_store, key: '_mysite_session'
这样做的缺点是它还会使所有其他 Redis 缓存对象无效并错误地重命名,因为会话存储之前没有密钥来识别它们。
我最近完成了一个 Rails 应用程序的大升级。我将 App 从 Rails 4.2.8
递增到 Rails 5.2.3
。一切都很顺利,我们所有的自动化测试都通过了,我们已经开始了用户验收测试。
到目前为止,唯一发现的问题是登录用户正在通过此升级注销。我们之前安装了 redis-rails
gem(版本 4.0.0
),以便为我们的 session_store
使用 Redis,现在我们使用 [=] 附带的内置 Redis 存储=16=].
我将我们的配置设置为使用与以前相同的 Redis 连接和相同的 session_store 键值,但我不明白为什么会话仍在重置。似乎 redis-rails 4.0.0
没有正确设置 session_store 键值?
从 redis-rails
升级到 Rails 5.2
时,有没有其他人处理过这个问题并成功保留了现有会话?
编辑:
已更新的其他可能相关的 gem 包括 ruby 2.3.4 => 2.5.5
、devise 4.0.3 => 4.6.2
和 redis 3.2.2 => 4.1.2
我想通了!我认为 session_store
配置的 key
参数应该设置 Redis 键值。此参数实际上用于用户浏览器 cookie 密钥。我所做的升级 did 向会话存储值添加了一个新的 Redis 键,但看起来没有任何参数可以更改或删除这个新的 Redis 键。
我的解决方案是使用脚本重命名我的所有 Redis 会话密钥以匹配新格式(我使用 'namespace' 作为 Redis 缓存存储命名空间):
redis-cli --scan --pattern "namespace:*" | \
awk '/^/ {new_key=;gsub(/namespace:/,"namespace:_session_id:", new_key); printf "*3\r\n\r\nrename\r\n$" length() "\r\n" "\r\n$" length(new_key) "\r\n" new_key "\r\n";}' | \
redis-cli --pipe
最终相关配置为:
config.cache_store = :redis_cache_store, { url: ENV['REDIS_URL'], namespace: 'namespace' }
config.session_store :cache_store, key: '_mysite_session'
这样做的缺点是它还会使所有其他 Redis 缓存对象无效并错误地重命名,因为会话存储之前没有密钥来识别它们。