$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?