Memcached o edge Rails

Buenas

Andaba realizando pruebas con el tema de la cache usando los módulos
que ofrece rails [1] así como las incorporaciones que se han echo en
edge [2] y buscando mas información sobre el tema doy con memcached [3].

Y ahora la duda, que usar? que opinión les merece.
¿es memcached para aplicaciones “grandes” y cache_page para
aplicaciones de “pequeñas” ?

[1] http://api.rubyonrails.com/classes/ActionController/Caching/Pages/
ClassMethods.html
[2] http://ryandaigle.com/search?q=caching
[3] memcached - a distributed memory object caching system

Gracias.
Un saludo.

Hola,

creo que tienes un poco de lío con el tema de cachés:

Por un lado están las cachés que incorpora Rails:

1 - caché de página: guarda el resultado de tu petición en un HTML
estático que servirá el servidor web la próxima vez que alguien pida
la misma URL

2 - caché de acción: ídem, pero no la sirve el servidor web, sino que
lo hace Rails. Esto permite preprocesar la caché y hacer sustituciones
o no servirla en caso que no se cumpla una condición, etcétera

3 - caché de fragmentos: cachea una parte del HTML de la respuesta. En
una página tú indicas fragmentos como bloques, y el contenido del
bloque es el fragmento a cachear.

Para [2] y [3], como es Rails el que las genera, existe la posibilidad
de guardar la caché en disco o en memcached, ideal cuando quieres
evitar problemas de uso excesivo de disco.

Como ves, [1], [2] y [3] son a nivel de controladores, acciones y
vistas.

A nivel de modelo de datos también se puede utilizar memcache, para
guardar el resultado de los accesos a base de datos utilizando el
objecto Cache como interfaz. Ejemplo:

Cache.set({:sql => ‘tags’}) = Tag.find_all_by_blog_id(3)

Y para recuperarlo basta con hacer Cache.get

Más información: http://nubyonrails.com/articles/memcached-basics-for-rails

Y por último, a lo que te refieres de nuevo en edge es caché de
consultas SQL, pero a nivel interno de ActiveRecord, que no está en la
mano del programador. Esa caché guarda las últimas consultas
realizadas y sus resultados.

Por ejemplo, cuando tenemos relaciones has_many es muy común llamar
constantemente al objeto A que tiene a muchos objetos B. Con query
cache se evita que el A se cargue todas las veces de base de datos.

Si te interesa, han hecho un plugin con esa funcionalidad para Rails
1.2+: http://agilewebdevelopment.com/plugins/query_cache

Espero que te sirva.

Un saludo.

Hola,

Para [2] y [3], como es Rails el que las genera, existe la posibilidad
de guardar la caché en disco o en memcached, ideal cuando quieres
evitar problemas de uso excesivo de disco.

fantástica la explicación. Solamente un detalle. El uso de memcached
además te permite que la caché esté compartida y distribuída. Es decir,
puedes tener varios mongrels corriendo (incluso en diferentes máquinas)
y que todos ellos tiren de la misma caché. Para aplicaciones muy
grandes, esto es interesante.

Y por último, a lo que te refieres de nuevo en edge es caché de
consultas SQL, pero a nivel interno de ActiveRecord, que no está en la
mano del programador. Esa caché guarda las últimas consultas
realizadas y sus resultados.

… y desgraciadamente esa caché, al menos la última vez que la miré,
guarda las consultas en un array en la instancia donde corre, así que si
tienes 8 mongrels haciendo la misma consulta, se hacen 8 hits a la db y
se guardan 8 copias del resultado. Además me pareció ver que la caché
sólo se guardaba a nivel de una acción, así que incluso en la misma
query generaría un nuevo hit a la db en diferentes acciones. No sé si
habrá cambiado algo desde entonces, pero cuando le eché el ojo
básicamente es eso lo que tenía… a ver si se lo curran un pelín más
para cuando salga la 2 :wink:

saludos,

javier ramírez

… y desgraciadamente esa caché, al menos la última vez que la miré,
guarda las consultas en un array en la instancia donde corre, así que si
tienes 8 mongrels haciendo la misma consulta, se hacen 8 hits a la db y
se guardan 8 copias del resultado. Además me pareció ver que la caché
sólo se guardaba a nivel de una acción, así que incluso en la misma
query generaría un nuevo hit a la db en diferentes acciones. No sé si
habrá cambiado algo desde entonces, pero cuando le eché el ojo
básicamente es eso lo que tenía… a ver si se lo curran un pelín más
para cuando salga la 2 :wink:

Además de que al ser ahora un plugin, no recibe todas las mejoras que
se hagan al código de ActiveRecord de Rails (ni la corrección de bugs
en caso de que los tuviera).

Así que cuidado con ese plugin :slight_smile:

Muchas gracias Fernando por la
explicación.Ahora veo que el usar las opciones de caches de rails no quita el
poder usar también memcached.

Gracias de nuevo.
Un saludo.