rails print logger log how ruby-on-rails ruby redis

ruby on rails - print - $ redis variable global con rubí sobre rieles



ruby logger levels (6)

Existe Redis.current , que puede utilizar para almacenar su instancia de Redis uno y solo.

Entonces, en lugar de usar $redis , puede asignar su instancia de la siguiente manera:

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

Redis.current se introdujo en redis-rb en 2010 como una forma estándar de obtener una conexión redis, por lo que me sorprendió que ninguna otra respuesta lo mencionara.

Estoy usando redis como caché de lectura. He creado un inicializador

config / initializer / redis.rb

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

Estoy usando este global en mi unicorn.rb para crear una nueva conexión cada vez que se crea un nuevo trabajador.

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

También estoy usando esta variable global cuando necesito acceder a mis servidores redis. Pero no me siento cómodo usando esta variable global. ¿Hay mejores opciones que usar la variable global?


Según this Heroku, no es necesario agregar $redis a tu Unicornio:

No se requiere una configuración especial cuando se usa Redis Cloud con un servidor Unicorn. Los usuarios que ejecutan aplicaciones Rails en Unicorn deben seguir las instrucciones en la sección Configuración de Redis desde Rails y los usuarios ...

Aquí está todo lo que tiene la " Configuración de Redis desde la sección Rails " para antes de Rails 4 (además del Gemfile y algunas otras cosas anteriores a Rails 3):

# config/initalizers/redis.rb if ENV["REDISCLOUD_URL"] uri = URI.parse(ENV["REDISCLOUD_URL"]) $redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password) end

Realmente no da una explicación de por qué "no se requiere una configuración especial".


Una opción con más espacio de nombre para reemplazar su variable global, puede crear un método en un módulo

module Caching def self.redis ... initialize/memoize/reconnect here... end end

Tú que luego lo llamas con:

Caching.redis


ampliando aún más la sugerencia de mestachs, incluya el nombre de un módulo en su inicializador como se muestra a continuación

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

entonces en 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


probar esto:-

puede usar una constant lugar de global variable como en config / initializer / redis.rb

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

y en unicorn.rb

before_fork do |server, worker| # clear redis connection REDIS.quit if defined?(REDIS) end

# Dale a cada niño proceso su propia conexión Redis

after_fork do |server, worker| REDIS ||= Redis.new(:host => ENV["REDIS_HOST"], :port => ENV["REDIS_PORT"]) end