2009-07-30 7 views
0

mon application montre des informations de contact (à partir de 2000 enregistrements de contact avec diverses informations détaillées (noms, numéros de téléphone, etc) qui forment le base d'une grille de contact) qui change généralement rarement.ASP.NET C#: Mise en cache Résultats de la base de données, Quand/comment invalider (sur la base de chaque enregistrement)

Un bon nombre d'utilisateurs ont le droit de modifier cette information, et si elle est éditée, il est nécessaire que la modification soit immédiatement visible par tout le monde. En même temps, je voudrais limiter la récupération de ces informations de la base de données chaque fois que quelqu'un consulte ces informations, en particulier parce que les jours peuvent passer sans que cela se produise.

Je pourrais récupérer la liste entière chaque fois qu'une modification de minute est faite, mais cela ne semble pas la bonne manière non plus. Donc, je cherche un moyen de tout mettre en cache, invalider & refetch seulement une partie qui est modifiée (disons, un enregistrement) tout en gardant tout le reste en cache. La page alimentait principalement le cache puis chaque fois qu'il est affiché, et l'extraction de données devient une exception.

Comment est-ce que je pourrais me rendre à ce design & code sage? Votre aide est très appréciée.

+0

Éditent-ils par un moyen que vous contrôlez? (C'est-à-dire une application qui pourrait invalider le cache?) –

+0

Oui, ce serait dans mon application web. – Alex

Répondre

3

Sur chaque opération d'insertion et de modifier, vous devez remplacer votre entrée dans le cache, puis écrire à la base de données

Je ne le ferais pas de cette façon. S'il existe plusieurs mises à jour simultanées, vous n'êtes pas sûr que les remplacements de cache sont effectués dans le même ordre que les mises à jour de la base de données (sauf si la mise à jour du cache fait partie de la même transaction).

Au lieu de cela je voudrais:

  • des objets dans le cache avec une clé de cache dérivée de la clé primaire.

  • Lors de chaque opération de mise à jour, supprimez simplement l'entrée de cache après la mise à jour de la base de données. De cette façon, le cache sera actualisé avec des données à jour la prochaine fois qu'il sera accédé.

0

À chaque insertion et opération d'édition, vous devez remplacer votre entrée de cache, puis écrire dans la base de données. Avant d'envoyer une modification à la base de données, vous devez également vérifier que l'entrée n'a pas été invalidée (c'est-à-dire que vous avez une lecture erronée), ce qui entraîne une perte de données. Si vous êtes vraiment préoccupé par l'intégrité des données, vous pouvez conserver un journal des transactions du cache & db opérations afin que vous ayez un moyen de savoir ce qui était en cours au moment d'une panne.

0

Il semble que vous deviez conserver un horodatage de chaque mise à jour. Chaque enregistrement est associé à un horodatage.

La première application charge chaque enregistrement et l'application enregistre l'horodatage maximal.

Chaque fois qu'une modification est enregistrée, l'horodatage de l'enregistrement est mis à jour. Ensuite, lorsque d'autres utilisateurs ont besoin de charger des modifications, vous pouvez demander n'importe quoi mis à jour après le dernier horodatage maximum connu du client. Les autres utilisateurs recevront uniquement les modifications.

0

MS Enterprise Library Caching Block a de bonnes fonctionnalités pour vous permettre de configurer les dépendances de cache et l'invalidation basée sur l'invalidation basée sur le temps et basée sur la notification (y compris celles soulevées à partir d'un magasin de données). Check it out

0

Nous avons utilisé le bloc de mémoire cache de la bibliothèque d'entreprise pour ce faire. Cependant, nous l'utilisons sans le backing store tel que décrit par Abhijeet Patel.

Le cache est structuré comme une paire clé/valeur. Lorsque l'utilisateur essaie d'obtenir un enregistrement, nous vérifions s'il se trouve dans le cache, si oui revenons du cache, si aucun n'obtient de la base de données et ne met à jour le cache.

Lorsque l'utilisateur modifie une ligne, mettez à jour le cache en même temps que la base de données est mise à jour.

Notez que cela fonctionne lorsque vous avez le contrôle sur la façon dont les données sont mises à jour. Vous devez également faire un peu plus de travail si le cache est stocké sur plusieurs serveurs.

+0

"mettre à jour le cache en même temps que la base de données est mise à jour." - comme décrit dans ma réponse, il est préférable de simplement supprimer du cache * après * la mise à jour de la base de données. – Joe

Questions connexes