2010-03-06 12 views
7

Actualmente hay dos problemas al almacenar objetos ActiveRecord en memcached.¿Cuál es la mejor manera de almacenar un objeto ActiveRecord en memcached?

  1. El problema Indefinido Clase/Módulo (Google search). Por lo que he leído, sigue siendo un error para el que nadie tiene una solución realmente buena. El plugin cache_fu tiene probablemente la mejor solución para esto, ajustando su llamada de recuperación en un bloque que intenta detectar este error, analiza el mensaje e intenta cargar la clase/módulo indefinido.

  2. El billete infame LH # 1339 (LH Ticket). Este error solo ocurrirá cuando tenga cache_classes establecido en FALSE (desarrollo, prueba).

Tras Google durante semanas, todavía no ha encontrado una buena técnica para almacenar instancias AR en memcached sin tener que lidiar con los 2 temas mencionados anteriormente.

La idea que aún no he probado es eliminar los atributos de la instancia como cadenas (cómo AR los recibe de la base de datos antes de su conversión), almacenarlos en memcached y luego recuperarlos de la memoria caché, de alguna manera instanciar un objeto AR usando estos valores. es posible? Si es así, ¿cuál es la mejor manera de hacerlo?

Estoy buscando maneras en que otros desarrolladores de Rails hayan abordado este problema.

Respuesta

3

En nuestros proyectos, almacenamos el objeto como XML.

cache.write(user.cache_key, user.to_xml) # write to cache 
User.new(Hash.from_xml(cache.read(cache_key))) # reach from cache xml 

Existe un costo adicional por la serialización/deserialización de XML. Pero esto nos ha permitido compartir el caché entre las aplicaciones que no son de Ruby.

+0

Me gusta la idea, lo intentaré –

+0

Probablemente vaya con JSON en este momento. En cualquier caso, he encontrado que almacenar cualquier cosa, excepto cadenas, ints y matrices de la misma en memcached es una locura. –

+0

Esto no funciona muy bien cuando dependes de los objetos AR recuperados de la caché para responder #new_record? y #id como si estuvieran cargados desde el DB. Este método solo crea un nuevo objeto AR no guardado que comparte algunas propiedades con el objeto real. –

Cuestiones relacionadas