La mise en cache distribuée est devenue un moyen populaire d'améliorer les performances et l'évolutivité des applications .NET. C'est pourquoi les développeurs mettent de plus en plus de données en cache dans un cache distribué. Cependant, cela s'accompagne de quelques défis. Un défi important consiste à s'assurer que les données du cache sont toujours synchronisées avec la base de données. En effet, le cache conserve une copie des données qui existent déjà dans la base de données.
Si plusieurs applications mettent à jour les mêmes données dans la base de données mais qu'elles n'ont pas toutes accès au cache distribué, vous vous retrouverez dans une situation où les données du cache sont plus anciennes et différentes de leur homologue dans la base de données. Et, bien que cela puisse convenir pour certains types de données de référence, ce n'est certainement pas acceptable pour les données transactionnelles. Les données de référence sont celles que vous lisez beaucoup mais que vous ne modifiez pas très fréquemment (par exemple, le catalogue de produits) tandis que les données transactionnelles sont quelque chose que vous lisez et modifiez fréquemment (par exemple, les données des clients ou des comptes).
NCache Détails Documents sur la dépendance du cache NCache Docs
Comment vous assurez-vous que le cache distribué reste synchronisé avec la base de données ?
La réponse est SqlCacheDependency
. Il fait partie du cache ASP.NET (System.Web.Caching) et vous permet de spécifier un jeu de données dans la base de données avec une instruction SQL, puis de recevoir des notifications d'événements .NET de SQL Server 2005/2008 chaque fois que votre jeu de données est modifié dans la base de données. .
NCache a intégré en interne SqlCacheDependency
dans le but de synchronisation du cache avec SQL Server 2005/2008 ou base de données Oracle. Pour vous, NCache fournit une interface similaire appelée SqlDependency qui vous permet de spécifier une instruction SQL représentant une ou plusieurs lignes dans une table donnée qui composent votre élément mis en cache. NCache puis utilise en interne SqlCacheDependency
pour établir un lien avec la base de données par rapport à ces lignes.
Ainsi, si vos données sont mises à jour dans la base de données par l'une de vos applications, SQL Server déclenche une notification d'événement .NET qui NCache intercepte et supprime l'élément correspondant du cache distribué. Cela résout le problème d'incohérence des données d'avoir deux copies différentes des mêmes données. En effet, lorsque votre application veut les mêmes données la prochaine fois, elle ne les trouve pas dans le cache et est obligée de récupérer la dernière copie de la base de données qu'elle met également en cache. Par ici, NCache garantit que les données du cache sont toujours cohérentes avec les données de la base de données.
Voici un exemple de code source d'utilisation de SqlDependency de NCache qui utilise en interne SqlCacheDependency
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
public class Program { // A standard Load method that loads a single row from database public Customer LoadCustomer(Customer cust) { String key = "Customer:CustomerID:" + cust.CustomerID; Customer cust2 = (Customer)NCache.Cache.Get(key); if (cust2 != null) return cust2; CustomerFactory custFactory = new CustomerFactory(); // Load a single customer from the database // SELECT * FROM Customers WHERE CustomerID = 'ALFKI' custFactory.Load(cust); // Create a SqlCacheDependency for this item CacheItem item = new CacheItem(cust); item.Dependency = SqlDependencyFactory(connectionString, "SELECT CustomerID FROM Customers WHERE CustomerID = '" + cust.CustomerID + "'"); // Store item in the cache along with SqlCacheDependency NCache.Cache.Insert(key, item); return cust; } // A query method public List<Customer> FindCustomers(String city) { String key = "List<Customer>:City:" + city; List<Customer> custList = (List<Customer>)NCache.Cache.Get(key); if (custList != null) return custList; CustomerFactory custFactory = new CustomerFactory(); // Load a list of customers from database based on a criteria // SELECT * FROM Customers WHERE City = 'San Francisco' custList = custFactory.FindByCity(city); // Create a SqlCacheDependency for this list of customers CacheItem item = new CacheItem(custList); item.Dependency = SqlDependencyFactory.(connectionString, "SELECT CustomerID FROM Customers WHERE City = '" + city + "'"); // Store list of customers in the cache along with SqlCacheDependency NCache.Cache.Insert (key, item); return custList; } } |
Dépendance du cache vis-à-vis de SQL Dépendance du cache de base de données Oracle Dépendance du cache personnalisé
En résumé, la fonctionnalité SqlDependency de NCache vous permet de synchroniser le cache avec la base de données et de maintenir l'intégrité des données. Vous pouvez maintenant commencer à mettre en cache toutes les données sans craindre d'utiliser des données obsolètes du cache. Et, bien sûr, plus vous mettez de données en cache, meilleures sont les performances et l'évolutivité de votre application.
Alors, téléchargez une version d'essai complète de 60 jours de NCache Enterprise et essayez-le par vous-même.