一尘不染

$ redis全局变量,在Ruby上运行

redis

我正在使用redis作为读取缓存。我已经创建了一个初始化器

config / initializer / redis.rb

$redis = Redis.new(:host => ENV["REDIS_HOST"], :port => ENV["REDIS_PORT"])

每当创建新工作线程时,我都会在unicorn.rb中使用此全局变量来创建新连接。

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

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


阅读 317

收藏
2020-06-20

共1个答案

一尘不染

进一步扩展方法建议,如下所示在初始化器中命名模块的间隔

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

然后在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
2020-06-20