Rails使用Redis作为与Unicorn的会话存储

时间:2014-08-06 05:53:50

标签: ruby-on-rails session redis

我刚从使用cookie作为会话存储切换到redis。 配置如下:

# Gemfile
gem 'redis-rails', group: :production

# config/initializers/session_store.rb
if ENV['RAILS_ENV'] == 'production'
  Rails.application.config.session_store :redis_store, redis_server: ENV['REDISCLOUD_URL'], expires_in: 60.minutes
else
  Rails.application.config.session_store :cookie_store, key: '_marketplace_session'
end

但是,我记得在设置独角兽时,我必须要注意外部连接。 这是Resque

的一个例子
before_fork do |server, worker|
  # If you are using Redis but not Resque, change this
  if defined?(Resque)
    Resque.redis.quit
    Rails.logger.info('Disconnected from Redis')
  end
end

after_fork do |server, worker|
  # If you are using Redis but not Resque, change this
  if defined?(Resque)
    Resque.redis = ENV['<REDIS_URI>']
    Rails.logger.info('Connected to Redis')
  end
end

我是否还必须在Unicorn配置中断开并重新连接Redis?我只使用Redis作为会话存储而不是别的。

赞赏任何意见。

1 个答案:

答案 0 :(得分:1)

由于redis-store使用redis-rb,因此需要在Unicorn forks之后创建连接。因此,如果连接已经打开,则必须执行类似于使用Resque执行的操作。

这是一个代码示例:

after_fork do |server, worker|
  # Anything else you may have
  # ...

  Rails.cache.reconnect
end

重新连接的调用将确保每个进程都使用自己的Redis客户端。