2009-08-29 7 views
5

J'ai eu l'idée suivante: Dites que nous avons une webapp écrite en utilisant django qui modélise un tableau d'affichage. Ce forum a beaucoup de threads mais quelques-uns d'entre eux obtiennent le plus de messages/vues par heure. Les pages de filetage sont légèrement différentes pour chaque utilisateur. Vous ne pouvez donc pas mettre en cache la page de rendu dans son intégralité et mettre en cache uniquement certaines parties de la page de rendu n'est pas non plus une option.Object stocker des objets dans Django entre les demandes

Mon idée était la suivante: je crée une structure d'objet du thread en mémoire (avec chaque message et autres données nécessaires pour l'afficher). Si un nouveau message est posté, la structure est mise à jour et chaque X messages (ou toutes les Y minutes, tout ce qui vient en premier) les nouveaux messages sont réécrits dans la base de données. Si l'application se bloque, certains messages sont perdus, mais cela est tout à fait correct (pour les utilisateurs et les administrateurs).

La question: Puis-je créer un tel stockage persistant dans la mémoire sans sérialisation (donc pas serialize-> memcached)? Si je comprends bien, les applications WSGI (comme Django) s'exécutent en continu sans interruption entre les requêtes, ce qui devrait donc être possible en théorie. Y a-t-il une API que je pourrais utiliser? Si non: un point à regarder?

/edit1: Je sais que "persistante" a habituellement une signification différente, mais dans ce cas je signifie strictement "entre demande".

+4

Qu'est-ce qui ne va pas avec la sérialisation? Avez-vous profilé votre application? La base de données I/O est-elle le goulot d'étranglement? –

Répondre

5

Dans un environnement WSGI de production, plusieurs processus de travail traiteraient probablement des demandes en même temps. Ces processus de travail seraient recyclés de temps en temps, ce qui signifie que les objets de mémoire locale seraient perdus.

Mais si vous en avez vraiment besoin (et assurez-vous de le faire), je vous suggère de regarder dans le caching framework de Django, vérifiez la mise en cache de la mémoire locale. Jetez également un coup d'œil à sessions.

Mais même la mise en cache de la mémoire locale utilise la sérialisation (avec pickle). Il est facile d'implémenter le cache de mémoire locale sans sérialisation en implémentant un backend de cache personnalisé (voir the docs). Vous pouvez utiliser le code locmem.py comme point de départ pour créer un cache sans sérialisation.

Mais je suppose que vous faites un peu d'optimisation prématurée ici?

+0

J'ai lu que mettre de gros objets en session est une mauvaise idée, y a-t-il une sorte de limite de taille douce où vous devriez éviter la session et utiliser le cache? Comment associeriez-vous la session à un objet particulier stocké dans le cache? Si vous aviez une association et que la session se terminait prématurément, comment effaceriez-vous l'objet associé du cache? – bischoffingston

0

Un stockage en mémoire n'est pas persistant, donc non.

Je pense que vous voulez dire que vous ne voulez écrire dans la base de données que X nouveaux messages d'objets. Je suppose que c'est pour des raisons d'accélération. Mais puisque vous avez besoin de les sérialiser tôt ou tard de toute façon, vous n'économisez pas vraiment le temps de cette façon. Cependant, vous gagnerez du temps en ne vidant pas les nouveaux objets sur le disque, mais la plupart des bases de données le supportent déjà.

Mais vous parlez également de la mise en cache de la page rendue, qui est la mise en cache en lecture. Vous ne pouvez pas mettre en cache le résultat final, mais vous pouvez mettre en cache le résultat de la requête de base de données. Cela signifie que le nouveau message ne sera pas immédiatement mis à jour, mais prendra une minute ou deux pour apparaître, mais je pense que la plupart des gens verront cela comme acceptable.

Mise à jour: Dans ce cas pas, alors. Mais vous devriez toujours pouvoir mettre en cache les résultats de la requête, mais invalider ce cache lorsque de nouvelles réponses sont ajoutées. Cela devrait aider.

+0

Je pensais qu'il serait clair que je voulais dire "entre les demandes" avec "persistante". En fait, le dernier point est la raison pour laquelle j'ai pensé à cela dans le stockage de la mémoire.Les nouveaux messages doivent apparaître immédiatement, donc je ne peux pas compter sur un cache de lecture, mais j'ai besoin de rendre la page sur (presque) chaque requête. Bien sûr, il y aura certaines demandes qui pourraient être faites avec une page en cache, mais la plupart d'entre elles ne le seront pas. –

+0

Eh bien, si l'écriture sur le disque est le goulot d'étranglement, alors vous êtes dans la merde profonde ici. ;) Mais pour la lecture, vous devriez être en mesure d'avoir memcache que vous invalidez lorsque de nouvelles réponses sont écrites. –

Questions connexes