Question

J'ai une page de profil utilisateur qui a une barre latérale avec des statistiques utilisateur comme pas comme la page de profil de débordement de pile (par exemple, les visites totales, le nombre de badges).

Le problème est qu'actuellement, je frappe la base de données et le calcul de ces statistiques avec chaque demande. Je peux implémenter la mise en cache des fragments pour réduire cela, mais existe-t-il une meilleure façon de gérer ce type de chose?

Le stockage des données de résumé agrégées dans la base de données semble entraîner des problèmes (c.-à-d. L'incohérence).

Était-ce utile?

La solution

Vous pouvez stocker ces informations dans la base de données au lieu de les recalculer, en utilisant:

  1. Comptoir la mise en cache
  2. Rappels personnalisés

Comptoir la mise en cache

Par exemple, si vous mesurant le nombre de badges, vous pouvez créer un champ de base de données dans User appelé badges_count, alors dans le modèle de badge, avez belongs_to :user, :counter_cache => true. Maintenant, chaque fois que le nombre de badges change, vous pouvez accéder au nombre sans aucun nouveau calcul à @user.badges_count.

Une implémentation de base: http://asciicasts.com/episodes/23-counter-cache-column

Rappels personnalisés

Disons que vous avez un champ qui mesure le comportement plus complexe qu'un simple nombre. Dans ce cas, implémentez simplement des rappels qui mettent à jour un champ chaque fois qu'une certaine action se produit en utilisant before_save, after_save, before_create, etc.

Préoccupations concernant l'incohérence

Le stockage des données de votre base de données ne sera incohérent que si vous vous faites mal. Il existe un nombre fini de chemins à travers lesquels toute statistique peut être mise à jour, et vous devez vous assurer que tous les chemins sont couverts dans la mise à jour du champ que vous utilisez. Rails le fait pour vous avec Counter_Caching, et vous devez le faire vous-même si vous utilisez des rappels personnalisés ou si vous avez une situation inhabituelle.

Autres conseils

Vous pouvez utiliser une div cachée comme dans cette question (Les données de mise en cache en utilisant des div cachés). Selon la quantité de données que vous souhaitez mettre en cache, cela pourrait être une bonne solution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top