$redis global variable with ruby on rails

redis, ruby, ruby-on-rails

Solution

expanding further on mestachs suggestion, namespacing a module in your initializer as below

config/initializers/redis.rb

module ReadCache
  class << self
    def redis
      @redis ||= Redis.new(:url => (ENV["REDIS_URL"] || 'redis://127.0.0.1:6379'))
    end
  end
end

then in unicorn.rb

 before_fork do |server, worker|
    ...
   if defined?(ReadCache.redis)
    ReadCache.redis.quit
   end
    ...
 end

 after_fork do |server, worker|
    ...
   if defined?(ReadCache.redis)
    ReadCache.redis.client.reconnect
   end
    ...
 end

Problem

I am using redis as a read cache. I have created an initializer config/initializer/redis.rb ``` $redis = Redis.new(:host => ENV["REDIS_HOST"], :port => ENV["REDIS_PORT"]) ``` I am using this global in my unicorn.rb to create a new connection whenever a new worker is created. ``` before_fork do |server, worker| # clear redis connection $redis.quit unless $redis.blank? end # Give each child process its own Redis connection after_fork do |server, worker| $redis = Redis.new(:host => ENV["REDIS_HOST"], :port => ENV["REDIS_PORT"]) end ``` I am also using this global variable whenever I need to access my redis servers. But I am not comfortable using this global variable. Are there any better options than using global variable?

Original source

Related problems