Le stockage des Données En Mémoire: Session vs Cache vs Statique
Un peu d'histoire: je suis en train de travailler sur une application web qui nécessite un peu de temps pour préparer /crunch de données avant de la donner à l'utilisateur de modifier /manipuler. La demande de données de la tâche ~ 15 /20 secondes à remplir et à quelques secondes de processus. Une fois là, l'utilisateur peut manipuler vaules à la volée. Toute manipulation des valeurs de besoin de données pour être retraité complètement.
Mise à jour: Pour éviter toute confusion, je ne fais que l'appel de données de 1 heure (le 15 sec hit) et de vouloir garder les résultats en mémoire, de sorte que je n'aurai pas l'appeler de nouveau jusqu'à ce que l'utilisateur est fait à 100% de travail avec elle. Donc, la première traction va prendre du temps, mais, à l'aide d'Ajax, je vais frapper la mémoire de données constamment mise à jour et de garder le temps de réponse d'environ 2 secondes ou si (je l'espère).
Afin de faire de cette efficace, je suis le mouvement de la intial de données dans la mémoire et à l'aide des appels Ajax vers le serveur de sorte que je peux réduire le temps de traitement pour traiter le recalcul se produit w/de l'utilisateur, des mises à jour.
Voici ma question, avec des performances à l'esprit, ce serait le meilleur moyen de stocker ces données, en supposant que seulement 1 utilisateur va travailler w/ces données à tout moment.
Aussi, l'utilisateur peut éventuellement être travaillent dans ce processus pour quelques heures. Lorsque l'utilisateur travaille w/les données, j'ai besoin d'une sorte de failsafe pour enregistrer l'utilisateur actuel de données (que ce soit dans la bd ou dans un sérialisé fichier binaire) devrait leur être interrompue, d'une certaine façon. En d'autres termes, j'ai besoin d'une solution qui possède un crochet pour me permettre de me vider la mémoire de l'objet de données dans le cas où l'utilisateur est déconnecté /distrait pendant trop longtemps.
Jusqu'à présent, voici mes réflexions:
L'État de Session - Pros: Bloqué à un seul utilisateur. A la Fin de la Session de l'événement qui va répondre à mon failsafe exigences. Inconvénients: plus Lent perf de mes options. La Fin de Session de l'événement est parfois difficile de s'assurer qu'elle déclenche correctement.
Cache - Pros: Bonne Perf. A accès à des dépendances de ce qui pourrait être un bonus plus tard en bas de la ligne, mais pas vraiment utile dans le champ d'application actuel. Inconvénients: Pas facile failsafe étape d'autre qu'une écriture basée sur des intervalles de temps. De portée mondiale - devra s'assurer que les utilisateurs ne sont pas en collision w/travail de chacun.
Statique - Avantages: Meilleure Perf. Easies pour maintenir comme je peut directement tirer parti de ma classe actuelle des structures. Inconvénients: Pas facile failsafe étape d'autre qu'une écriture basée sur des intervalles de temps. De portée mondiale - devra s'assurer que les utilisateurs ne sont pas en collision w/travail de chacun.
Quelqu'un aurait-il des suggestions et /ou commentaires sur ce que j'ai l'option que je devrais choisir?
Merci!
Mise à jour: j'ai Oublié de mentionner, je suis en utilisant VB.Net, Asp.Net et Sql Server 2005 pour effectuer cette tâche.
Je crois que j'aurais été plus précis w/ performance. Je ne vous inquiétez pas tellement sur le serveur de la manipulation de l'utilisation de la mémoire, mais, plutôt, combien de temps il faudra pour obtenir ma réponse à l'utilisateur.
Quelle langue/tech utilisez-vous?
Lol, pourrait avoir spécifié. Dans ce cas, je suis en utilisant VB.Net, Asp.Net et Sql Server 2005
OriginalL'auteur Nathan | 2009-01-30
Vous devez vous connecter pour publier un commentaire.
J'irais avec la méthode de mise en cache pour stocker les données à travers tout le chargement de la page. Vous pouvez nommer le cache que vous souhaitez stocker les données pour éviter les conflits.
Pour le suivi de l'utilisateur les modifications apportées, j'irais avec un plus vieux de la démarche de l'école: ajouter à un fichier texte, chaque fois que l'utilisateur effectue un changement et puis balayer ce fichier à des intervalles pour enregistrer les modifications dans la base de données. Si vous nommez les fichiers basé sur l'utilisateur/compte ou de certains autres à la session de l'unique indicateur ensuite, il n'y a pas de problème de conflit et de l'application (ou quelque autre support d'application, ce qui pourrait être une meilleure idée en général) permet de balayer à travers tous ces fichiers et mise à jour de la DB, même si la session est plus.
La première partie de ce qui peut être ajusté pour échelonner les écrire plus: enregistrer les modifications apportées à la Session, puis d'écrire que de déposer à intervalles, puis balayer le fichier à des intervalles plus grands. vous pouvez la régler à la performance et à choisir quel est le niveau de l'utilisateur-modifier perte sera possible.
OriginalL'auteur notnot
Je vais voter pour secret option #4: utilisation de la base de données. Si vous parlez d'un 20+ deuxième temps de traitement sur les données, vous n'allez pas gagner quelque chose en essayant de faire cela en mémoire, étant donné les limites des options présentées. Vous pourriez aussi bien mis cela dans la base de données (donner un tableau de son propre, ou même une base de données distincte si ces exigences sont que les grands).
OriginalL'auteur TheSmurf
Utiliser la Session, mais ne comptez pas sur elle.
Simplement, permettre à l'utilisateur de "nom" du jeu de données et faire un point de la persistance de l'utilisateur, soit automatiquement, soit par le biais de quelque chose d'aussi simple que d'un bouton "enregistrer".
Vous ne pouvez pas compter sur la session, simplement parce qu'il est (généralement) liée aux utilisateurs instance du navigateur. Si ils ont accidentellement fermer le navigateur (cliquez sur le bouton X, leur PC se bloque, etc.), alors qu'ils perdent la totalité de leur travail. Ce qui serait méchant.
Une fois que l'utilisateur a ce genre de contrôle sur les "permanents" de l'état des données, vous pouvez compter sur la Session pour le garder en mémoire et de l'effet de levier que comme un cache.
OriginalL'auteur Will Hartung
Je pense que vous avez assez bien répondu à votre question avec les avantages/inconvénients. Mais si vous êtes à la recherche pour certains de validation par les pairs, mon vote est pour la Session. Bien que la performance est plus lente (savez-vous par comment beaucoup plus lent?), votre traitement est va prendre beaucoup de temps, que ce soit. Pensez-vous que l'utilisateur verra la différence entre 15 secondes et 17 secondes? Les deux sont "toujours" en termes de web, alors allez avec celui qui semble le plus facile à mettre en œuvre.
peut-être un peu hors sujet. Je vous recommande de mettre ces longs de traitement des appels asynchrones (à ne pas confondre avec l'AJAX asynchrone) pages.
Prendre un coup d'oeil à cet article et de me ping de retour si ça n'a pas de sens.
http://msdn.microsoft.com/en-us/magazine/cc163725.aspx
OriginalL'auteur Al W
Je suggère de créer une copie des données dans une nouvelle table de base de données (EDIT) que vous envoyer les premiers résultats à l'utilisateur. Si la performance est un problème, de le faire dans un thread d'arrière-plan.
Que l'utilisateur modifie les données, mise à jour de la table (également dans un thread d'arrière-plan si la performance est un problème). Si vous devez utiliser des threads, vous devez assurez-vous que le premier thread est terminé avant de commencer à mettre à jour les lignes.
Cela permet à un utilisateur de s'éloigner, revenir, même redémarrer le navigateur et de s'engager à chaque fois qu'elle se sent satisfait du résultat.
OriginalL'auteur Aaron Digulla
Une alternative possible à ce que les autres ont mentionné, est de stocker les données sur le client.
En supposant que l'ensemble de données n'est pas trop grande, et le code qui manipule, il peut être manipulé côté client. Vous pouvez stocker les données comme un îlot de données XML ou JSON en objet. Ces données peuvent ensuite être manipulés et transformés et traités de tous les côté client sans aller-retour vers le serveur. Si vous avez besoin de persister ces données vers le serveur à la fin des données qui en résulte pourrait être affiché via une requête AJAX ou standard de publication.
Si cela ne fonctionne pas avec vos exigences, j'irais avec juste de les stocker sur le serveur SQL server comme les autres commentaire, il est proposé.
OriginalL'auteur James