2012-07-08 9 views
5

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

Respuesta

6

Tome una mirada en el método de reconexión de la tienda Redis: https://github.com/jodosha/redis-store/blob/master/redis-activesupport/lib/active_support/cache/redis_store.rb

Así que, básicamente, su bloque tenedor debe verse como:

if defined?(PhusionPassenger) 
    PhusionPassenger.on_event(:starting_worker_process) do |forked| 
    if forked 
     Rails.cache.reconnect 
    end 
    end 
end 
+1

no pude conseguir '$ redis.reconnect' a trabajar, pero' Rails.cache.reconnect' hizo el truco. – anthonyfojas

+0

muy bien hecho. I + 1d tu respuesta – Tor

Cuestiones relacionadas