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连接的标准方式,所以我很惊讶没有其他答案提到它.
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)