Dois-je mettre les données en cache ou accéder à la base de données?


10

Je n'ai travaillé avec aucun mécanisme de mise en cache et je me demandais quelles sont mes options dans le monde .net pour le scénario suivant.

Nous avons essentiellement un service REST où l'utilisateur transmet l'ID d'une catégorie (dossier de réflexion) et cette catégorie peut avoir beaucoup de sous-catégories et chacune des sous-catégories peut avoir 1000 conteneurs de médias (objets de référence de fichier de réflexion) qui contiennent des informations sur un fichier qui peut se trouver sur un serveur NAS ou SAN (les fichiers sont des vidéos dans ce cas). La relation entre ces catégories est stockée dans une base de données avec des règles d'autorisation et des métadonnées sur les sous-catégories.

Donc, du point de vue de l'interface utilisateur, nous avons un contrôle d'arbre chargé paresseux qui est piloté par l'utilisateur en cliquant sur chaque sous-dossier (pensez à l'explorateur Windows). Une fois arrivés à l'URL du fichier vidéo, ils peuvent alors regarder la vidéo.

Le nombre d'utilisateurs pourrait augmenter dans les 1000 et les sous-catégories et vidéos pourraient être dans les 10000 à mesure que le système se développe.

La question est de savoir si nous devons continuer à travailler actuellement là où chaque requête atteint la base de données ou devrions-nous penser à mettre les données en cache?

Nous utilisons IIS 6/7 et Asp.net.


4
Avez-vous profilé votre système sous une charge réaliste? Les données peuvent -elles être mises en cache? Cela aurait-il du sens?

Réponses:


13

Tout d'abord, assurez-vous que le code est partitionné de manière à ce que votre fournisseur de données puisse être changé facilement. Nous parlons de ségrégation d'interface et des autres principes SOLID ici.

Ensuite, vous devez connaître la réponse aux éléments suivants:

1) Les données changeront-elles fréquemment? 2) L'application interroge-t-elle fréquemment votre service REST pour obtenir ces mises à jour? 3) La base de données est-elle utilisée à d'autres fins? 4) Êtes-vous au courant de problèmes de performances actuels? 5) Les données sont-elles mises à jour par votre application et ces mises à jour doivent-elles être reflétées dans l'application?

La chose intéressante est qu'en utilisant la base de données, vous mettez déjà les données en cache techniquement. C'est ce que fait une base de données. Une grande partie de la R&D consiste à rendre la base de données aussi rapide que possible lors de la récupération des données. Il utilise son propre cache mémoire pour les données fréquemment utilisées par exemple.

Alors demandez-vous ce que vous espérez gagner en échangeant des fournisseurs de cache? Et quelles sont les limitations actuelles qui doivent être résolues?

Si vous ne rencontrez actuellement aucun ralentissement, je dirais simplement "non, pas besoin de changer".

C'est un très gros sujet. Les caches ont tendance à très bien fonctionner lorsque les données doivent être réparties géographiquement, mais il y a un énorme surcoût en termes de gestion.

Je fais un projet au moment où je prends exactement le même genre de décisions.

Jusqu'à présent, ma solution consiste à utiliser la base de données uniquement et à la frapper beaucoup avec les demandes d'interrogation de chaque client. Cela semble dégoûtant, mais il évolue (en test) beaucoup plus que ce dont j'ai besoin, le code est très simple.

Cela dit, mon code utilise une sorte de modèle de référentiel qui extrait le fournisseur de données de l'application principale du code de la base de données. Si je voulais échanger un fournisseur de cache comme GemFire, cela nécessiterait une assez petite quantité de code pour le faire.


Merci Ian. À ce stade, nous avons une base de données, mais c'était plutôt une question éducative sur les choses à surveiller.
JD01

18

Il n'y a vraiment pas assez d'informations, selon les commentaires de Thorbjørn.

La mise en cache, lorsqu'elle est mal effectuée, peut vous causer beaucoup de chagrin à vous et à vos utilisateurs. Assurez-vous que vous devez vous soucier de la mise en cache avant de trop compliquer votre application.

Donc, en l'absence d'informations indiquant que vous avez vraiment besoin de mettre en cache, ne mettez pas en cache.

[Règle générale d'optimisation: si vous devez demander si je dois faire quelque chose, la réponse est non] *
* Ce serait une déclaration, pas une question, dans la plupart des endroits où la réponse est oui.


J'adore la règle générale, bien dit :)
Ian

@ dan-mcgrath Est-ce une bonne idée de mettre en cache des entrées si je vais accéder à chaque entrée exactement 2 fois seulement en l'espace de 5 minutes et jamais après?
nishantbhardwaj2002
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.