带有ruby on rails的$ redis全局变量

Ani*_*n J 33 ruby ruby-on-rails redis

我使用redis作为读缓存.我创建了一个初始化器

配置/初始化/ redis.rb

$redis = Redis.new(:host => ENV["REDIS_HOST"], :port => ENV["REDIS_PORT"])
Run Code Online (Sandbox Code Playgroud)

我在unicorn.rb中使用this global来创建新的连接,无论何时创建新的worker.

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
Run Code Online (Sandbox Code Playgroud)

每当我需要访问我的redis服务器时,我也在使用这个全局变量.但我不习惯使用这个全局变量.有没有比使用全局变量更好的选择?

Nob*_*are 70

还有Redis.current,你可以用它来存储您的一个和唯一的Redis实例.

因此$redis,您可以按如下方式分配实例,而不是使用它:

Redis.current = Redis.new(:host => ENV["REDIS_HOST"], :port => ENV["REDIS_PORT"])
Run Code Online (Sandbox Code Playgroud)

Redis.current在2010年引入redis-rb作为获取redis连接的标准方式,所以我很惊讶没有其他答案提到它.

  • 恼人的是,这是我正在寻找的答案,但因为它低于公认的答案,所以我浪费了时间不这样做。 (2认同)
  • 我提出了一个问题,要求“官方”建议:https://github.com/redis/redis-rb/issues/1064 (2认同)
  • @courtsimas 感谢您注意到这一点。我已在相应的提交中询问并相应地更新了答案。 (2认同)

blo*_*tto 28

进一步扩展mestachs建议,在初始化程序中命名一个模块,如下所示

配置/初始化/ redis.rb

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

然后在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
Run Code Online (Sandbox Code Playgroud)