2012-01-21 3 views
0

J'ai stocké de nombreux enregistrements de mesures d'énergie dans un modèle.Mise en cache des données traitées en django

Mes utilisateurs ont besoin d'accéder fréquemment à un rapport d'énergie utilisé, donc un model.manager est chargé pour interroger beaucoup d'enregistrements, appliquer un algorithme qui prend ~ 2 secondes, ce qui est beaucoup de temps, j'ai testé memcached mais avec pas de chance car après un certain temps, les données mises en cache ne sont pas disponibles, mais les utilisateurs reviennent souvent pour voir les mêmes rapports. Donc ma solution potentielle à ce problème de performance est de stocker les données traitées (pas seulement le jeu de requêtes mais le jeu de données après l'application de l'algorithme) dans un modèle appelé "ProcessedData".

Ainsi, lorsque l'utilisateur est invité à accéder au rapport d'énergie, le gestionnaire en charge interrogera d'abord ProccessData et si ProccessData.objects.filter(field1='field1').exist(): les données renvoyées seront directement transmises au modèle pour la visualisation. Si les données requises n'ont pas été préalablement requises, le gestionnaire chargé devra appliquer l'algorithme et renvoyer la demande à l'utilisateur.

Est-ce une bonne approche?

Répondre

1

Avant de commencer quelque chose comme ça, je voudrais certainement donner des projets comme django-cache-machine ou johnny-cache un essai, ils modèlent la mise en cache et ils le font bien.

Je pense que johnny cache est celui qui correspond le mieux à vos besoins puisqu'il n'expire jamais la mise en cache de l'ensemble de requêtes. Je ne suis pas sûr de ce que vous entendez par "données de cache est indisponible", mais c'est quelque chose que vous pouvez facilement résoudre de plusieurs façons (par exemple en utilisant un cache de cache persistant comme redis).

C'est une autre chose que j'essaierais avant la mise en cache de base de données que vous êtes sur le point d'implémenter si vous avez besoin de quelque chose de plus que la mise en cache des ensembles de requêtes.

utils cache Django est livré avec un beau décorateur de cache (le @cached) (voir docs et exemple here) qui ne cache basée sur des paramètres

+0

Lorsque je traite les données en utilisant en entrée le résultat d'une requête Je sais que la requête et même la requête qui est envoyée à l'utilisateur est mise en cache lorsque j'utilise memcache de johny-cache, le problème apparaît lorsque ces données sont requises 12 heures plus tard peut-être un jour, dans ce cas et selon la quantité d'interaction avec d'autres utilisateurs , les données traitées initialement mises en cache ne sont pas disponibles. – Jaime

+1

Avez-vous essayé quelque chose comme le décorateur @cached de django-cache-utils? combinez cela avec un backend de cache personnalisé qui n'expire jamais la mise en cache (le cache de johnny par exemple le fait puisque django ne supporte pas "forever") et vous avez la mise en cache des résultats persistants –