Quiero usar la tienda de caché de redis (utilizando redis-store gema).Reinicio de raíles Redis Caché Conexión de tienda a la horquilla de pasajero
Funciona bien a nivel local, pero cuando se realiza una producción en la que Passenger bifurca varias instancias de trabajadores de Rails, obtenemos errores de Redis que indican problemas de sincronización entre las diferentes instancias relacionadas con el acceso de Redis.
Un ejemplo de este tipo de error es
Got '7' as initial reply byte. If you're running in a multi-threaded environment, make sure you pass the :thread_safe option when initializing the connection. If you're in a forking environment, such as Unicorn, you need to connect to Redis after forking.
redis (2.2.2) lib/redis/connection/ruby.rb:78:in `format_reply'
he hecho un poco de lectura y aprendido que cada instancia del trabajador pasajero debe crear su propia conexión Redis. Esto podría ser implementado utilizando el siguiente código
#config/initializers/redis_fork_init.rb
if defined?(PhusionPassenger)
PhusionPassenger.on_event(:starting_worker_process) do |forked|
if forked
$redis = Redis.new
end
end
end
Suponiendo que el acceso se realiza a través Redis $ Redis todo el código - esta solución es grande.
Mi pregunta es: ¿cómo puedo crear una nueva conexión Redis que se utilizará cuando hago Rails.cache
operaciones como leer, escribir, etc.?
mi config/ambientes/production.rb incluye lo siguiente:
config.cache_store = :redis_store, { :host => 'localhost', :port => 6379, :thread_safe => true }
El uso de rieles 3.2.3, 2.2.2, Redis Redis-tienda 1.1.1, 3.0 pasajeros
no pude conseguir '$ redis.reconnect' a trabajar, pero' Rails.cache.reconnect' hizo el truco. – anthonyfojas
muy bien hecho. I + 1d tu respuesta – Tor