Quelle est la meilleure façon de mettre en cache un jeu de résultats paginé avec rails et memcached?pagination et memcached dans les rails
Par exemple, messages contrôleur:
def index
@posts = Rails.cache.fetch('all_posts') do
Post.paginate(:conditions => ['xx = ?', yy], :include => [:author], :page => params[:page], :order => 'created_at DESC')
end
end
Cela ne fonctionne évidemment pas lorsque les params[:page]
changements. Je peux changer la clé pour "all_posts_#{params[:page]}_#{params[:order]_#{last_record.created_at.to_i}"
, mais alors il pourrait y avoir plusieurs ordres possibles (récents, populaires, les plus votés etc) et il y aura une combinaison de pages et de commandes ... beaucoup de clés de cette façon.
Problème n ° 2 - Il semble que lorsque j'implémente cette solution, les caches sont écrits correctement et la page se charge correctement lors du premier appel à une action paginée. Lorsque je clique sur la même page, c'est-à-dire page1, avec l'ordre recent
, il semble que le navigateur ne fait même pas un appel au serveur. Je ne vois aucune action de contrôleur appelée dans le journal de production. J'utilise passager, REE, memcached et rails 2.3.5. Firebug ne montre aucune demande en cours ....
Existe-t-il un moyen simple/plus gracieux de gérer cela?
Merci. Pour le deuxième problème, je pense que cette autre question pourrait vous donner plus d'indices. http://stackoverflow.com/questions/3743268/max-age-with-nginx-passenger-memcached-rails2-3-5. pour une raison quelconque, le max-age est réglé même si je ne fais rien dans mon application rails, essayant toujours de comprendre le problème. J'entends nginx est un proxy inverse aussi, peut-être qu'il a quelque chose à voir avec ça? – badnaam
avec cette commande "(" updated_at DESC "). First" approche, cette requête va-t-elle s'exécuter chaque fois qu'une requête arrive? – badnaam
Oui, il fonctionnera à chaque fois, sauf si vous combinez cela avec une autre approche de mise en cache. Mais en général, il n'y a pas d'autre moyen de le faire. Vous devez vérifier si le cache est valide en regardant dans votre base de données. Mais dans la plupart des cas, cela accélère beaucoup les choses de toute façon. – mdrozdziel