2009-05-09 21 views
14

ya que las transcaciones de bases de datos en nuestra aplicación cada vez son más y más, hemos comenzado a usar memcached para reducir la cantidad de consultas pasadas a MySQL.¿Mejores prácticas para usar memcached en Rails?

En general, funciona bien y realmente ahorra mucho tiempo.

Pero a medida que el almacenamiento en caché se "silencio apareciendo" como una solución para dar la aplicación más jugo, una gran cantidad de nuestros modelos ahora contiene código como este:

def self.all_cached 

    Rails.cache.fetch('object_name') { 

    find(

     :all, 
     :include => [associations]) 

    } 

end 

Esto se está volviendo cada vez más molesto, ya que el llenado y el lavado del caché ocurre en varias clases a través de la aplicación.

Ahora, me preguntaba si había una mejor manera de extraer la lógica memcached para que sea más poderosa y fácil de usar en todos los modelos necesarios.

Estaba pensando en tener algún tipo de módulo de memcached que se incluye en todos los módulos necesarios.

Pero antes de jugar un rato, pensé: Vamos a pedir a los expertos primero :-)

Gracias

Matt

Respuesta

13

Recomendaría revisar los complementos existentes, los dos más grandes son cache_fu y cache money. Para su caso de uso en el que desea cargar el modelo con sus asociaciones fuera de caché no te recomiendo que pruebe caché dinero, lo que lo hace casi automáticamente:

def parent < ActiveRecord::Base 
    has_many children 
end 

def child < ActiveRecord::Base 
    index :parent_id 
end 

#now you can do the following without ever hitting the DB 
parents = Parent.find :all 
parents.each{ |p| p.children } 

El muy grande victoria con caché de dinero es que cuando usted escala hasta el punto en que el retraso de la replicación de la base de datos se convierte en un problema, escribir a través del almacenamiento en caché salva su culo. Esto es especialmente importante con Rails, donde el retraso de replicación puede causar fácilmente 500 errores y, en general, es una pesadilla que no desea tener.

5

Sí, tener un módulo de memcached de que incluye en todos los modelos que lo necesite en creo que es la mejor solución. Su línea de pensamiento es excelente :)

+1

Gracias, funciona genial. – Matt

+3

¿me puede recomendar uno o está diciendo escribir uno desde cero? esta respuesta no parece completa –

Cuestiones relacionadas