Question

J'ai une ferme de serveurs, chaque serveur effectue régulièrement une requête identique à la base de données. Ces résultats de la requête sont mises en cache dans un cache partagé, accessible à tous les serveurs.

Comment puis-je assurer qu'une requête plus récente ne soit pas écrasé par une requête plus? Est-il possible de versioning les requêtes en quelque sorte, par le temps, par exemple, de sorte que cette ne se fait pas? Comment traiter les requêtes simultanées?

Merci!

Edit: db est SQL Server. La requête est une instruction select. Et, le mécanisme de mise en cache est très simple: écriture simple, sans verrouillage. Et c'est parce qu'il n'y a actuellement aucun moyen de dire l'ordre des requêtes de sélection.

Était-ce utile?

La solution

Une approche est d'avoir un compteur de mise à jour globale dans la base de données, que ce soit pour les mises à jour ou pour la lecture (mises à jour est plus efficace, mais aussi plus difficile à obtenir à droite).

Donc, chaque mise à jour, incrémenter aussi le compteur global. Sur chaque lecture, lisez le compteur global, et de mettre les données dans le cache ainsi que la valeur du compteur. remplacer uniquement le contenu du cache si la valeur du compteur est plus grande.

En raison de l'isolement de la base de données, les transactions doivent apparaître comme si elles se sont passées d'une manière série (en supposant que vous avez choisi le niveau d'isolation SERIALIZABLE). Cela, à son tour, signifie que les numéros de compteur strictement supérieur se rapportent à des données plus récentes.

Autres conseils

Où se trouve le cache? Est-ce un fichier de disque? Ou une table dans la base de données?

Et qu'est-ce que cela veut dire quand vous dites une requête plus peut remplacer une nouvelle? Est-il vrai que la requête le plus récemment complété (ou peut-être le plus récemment commencé) est le plus récent?

Vous devez verrouiller le conteneur de cache avant d'effectuer chaque requête, que ce soit un fichier ou une table. Chaque serveur ne doit effectuer la requête si elle peut obtenir le verrou, sinon il doit attendre que la ressource verrouillée. De cette façon, le cache ne contiendra que les résultats les plus récents.

Est-ce le long des lignes de ce que vous demandez?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top