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
si aún no usa otro Rails.cache, le aconsejo que solo use ese mecanismo con redis.
La gema redis-store lo hace realmente fácil ( https://github.com/redis-store/redis-store )
De esta manera, solo puede hacer Rails.cache.reconnect
y todo está bien.
https://github.com/redis-store/redis-store/issues/21#issuecomment-948569
También te permite usar la increíble API Rails.cache, que tiene algunas características interesantes: http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html