Digamos que tiene un fragmento de la página que muestra las publicaciones más recientes y expira en 30 minutos. Estoy usando Rails aquí.La mejor manera de combinar el almacenamiento en memoria caché de fragmentos y objetos para memcached y Rails
<% cache("recent_posts", :expires_in => 30.minutes) do %>
...
<% end %>
Es obvio que no es necesario hacer la consulta de base de datos para obtener los mensajes más recientes si existe el fragmento, por lo que debería ser capaz de evitar que los gastos generales también.
Lo que estoy haciendo ahora es algo como esto en el controlador que parece funcionar:
unless Rails.cache.exist? "views/recent_posts"
@posts = Post.find(:all, :limit=>20, :order=>"updated_at DESC")
end
¿Es esta la mejor manera? ¿Es seguro?
Una cosa que no entiendo es por qué la clave es "recent_posts
" para el fragmento y "views/recent_posts
" al comprobar más tarde, pero se le ocurrió esta después de ver memcached -vv
para ver lo que estaba usando. Además, no me gusta la duplicación de ingresar manualmente "recent_posts
", sería mejor mantener eso en un solo lugar.
Ideas?
Aunque creo que la respuesta de Lar podría ser un poco más clara, y evita el uso de la meta programación, tu respuesta es mejor ya que ad está escuchando más de cerca a MVC. Los he votado como válidos, pero dejaré que la comunidad decida (no elegirá uno como aceptado :) ¡Gracias! –
Estoy de acuerdo, y creo que esta es una buena solución también. En cuanto a reutilizar la vista, sí, en general, ese es un buen principio. Tendría que dejar que el controlador también le proporcione la clave de caché para que funcione aquí. Por cierto, curiosamente, la documentación de la API sobre el almacenamiento en caché de fragmentos viola el principio de MVC en el primer ejemplo: http://api.rubyonrails.org/classes/ActionController/Caching/Fragments.html –