Les applications Web ASP.NET, les applications de service Web .NET et d'autres applications serveur .NET doivent gérer des charges de transaction extrêmes sans ralentissement. Bien que leur niveau d'application évolue de manière linéaire, le niveau de stockage de données et de base de données n'évolue pas et devient donc un goulot d'étranglement. Par conséquent, l'ensemble de l'application ne peut pas évoluer.
À l'origine, de simples magasins de clé-valeur distribués en mémoire comme Memcached et ensuite Redis a été introduit sur les plates-formes Unix/Linux pour aider à résoudre ce problème d'évolutivité. Ils sont rapidement devenus très populaires, principalement parce qu'ils offraient une évolutivité linéaire, tout comme les niveaux d'application, et supprimaient le goulot d'étranglement de la base de données.
NCache Détails NCache Docs NCache API client
Limitations dans les magasins de valeurs clés
Mais, malgré leur popularité, ces solutions étaient très simples, basiques par nature, et ne résolvaient pas vraiment de nombreux problèmes rencontrés par les applications réelles. Certains des domaines où ces solutions étaient très faibles comprenaient :
- Manque de haute disponibilité
- Manque de moyens intelligents de garder le cache à jour
- Manque de requête SQL
- Absence de code de mise en cache côté serveur (par exemple, lecture directe)
Par exemple, la haute disponibilité était si faible dans Memcached que des tiers ont commencé à développer des « correctifs » haute disponibilité pour cela. Mais l'architecture sous-jacente n'a pas été conçue pour une haute disponibilité et ces solutions sont donc restées assez limitées par nature. Redis avaient les mêmes problèmes de disponibilité, mais ont ensuite repensé leur produit pour intégrer certaines fonctionnalités de haute disponibilité telles que la réplication des données et la prise en charge du basculement. Mais il y a encore de gros trous dans tous les produits de magasin à valeur clé comme Memcached et les Redis. C'est là que les solutions de cache distribué sont venues à la rescousse.
Cache distribué .NET en tant que 2nd Génération Key Value Store
Un cache distribué .NET comme NCache d'autre part a été conçu dès le premier jour pour répondre à toutes les limitations mentionnées ci-dessus. Donc, en substance, NCache est un 2nd Génération vers les magasins de valeurs clés d'origine comme Memcached et les Redis. NCache est un cache distribué populaire de 10 ans pour .NET.
Cluster de cache dynamique et réplication de données
Un cache distribué comme NCache dispose d'un cluster de cache dynamique à réparation automatique qui regroupe toutes les ressources de processeur et de mémoire de tous les serveurs de cache du cluster. En même temps, NCache fournit une variété de topologies de mise en cache avec différentes stratégies de distribution et de réplication des données. Ceci permet NCache pour évoluer linéairement sans compromettre la haute disponibilité. Et, même si un serveur de cache tombe en panne, aucune perte de données ne se produit, le cluster de cache continue de fonctionner et toutes les applications utilisant le cache continuent également sans aucune interruption.
Garder le cache à jour
Un autre domaine où un cache distribué comme NCache brille, garde les données à jour et toujours cohérentes avec la base de données. NCache le fait à travers une variété de fonctionnalités, y compris expirations, pilotage événementiel Dépendance SQL, DbDependency basée sur l'interrogation et prise en charge de Procédures CLR pour les bases de données relationnelles. Les expirations fonctionnent comme les magasins de valeurs clés, mais Dépendance SQL et DbDependency permettent NCache pour synchroniser le cache avec toute modification de la base de données pour les données associées. Et, Procédures stockées CLR permettent de mettre à jour directement le cache depuis votre base de données SQL Server lorsque les données correspondantes changent.
Cela signifie que même si une application tierce modifie des données dans la base de données, NCache se met immédiatement à jour en conséquence. L'avantage est que vous pouvez mettre en cache presque toutes vos données d'application au lieu de mettre en cache des données en lecture seule, offrant de meilleures performances et un gain d'évolutivité.
Recherche dans le cache avec SQL
Ainsi, lorsque vous êtes en mesure de mettre en cache la quasi-totalité de vos données grâce aux fonctionnalités de "garder le cache à jour", vous rencontrez le problème de ne pas pouvoir trouver facilement les données si le seul mécanisme est la clé-valeur. Mais, si vous pouviez rechercher des données basées sur des attributs, alors un cache distribué comme NCache devient aussi facile à rechercher qu'une base de données. NCache vous fournit SQL et Interrogation LINQ dans ce but.
En plus des Requête SQL en fonction des attributs d'objet, vous pouvez affecter Groupes, Tagset une Balises nommées aux éléments mis en cache et incluez-les dans vos requêtes SQL. Vous trouverez ci-dessous un exemple d'interrogation SQL en C#. Par exemple:
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 |
using Alachisoft.NCache.Runtime; using Alachisoft.NCache.Runtime.Exceptions; using Alachisoft.NCache.Web.Caching; public void SearchDataUsingSQL() { Cache cache = NCache.InitializeCache("myparitionreplica"); string query = "SELECT this.Category, " + "MAX(Prod.Product.ProductID) " + "WHERE this.Category = ? " + "GROUP BY this.Category"; Hashtable values = new Hashtable(); values.Add("Category", 4); ICacheReader reader = cache.ExecuteReader(query, values); if (reader.FieldCount > 0) { while (reader.Read()) { //you can get value through the field name... object category = reader.GetOrdinal("Category"); //perform operations } } reader.Close(); return data; } |
Code côté serveur
Enfin, il y a du code côté serveur comme Lire à travers, Ecriture, Dépendance personnaliséeet une Chargeur de cache et rafraîchissement c'est très utile. Ce code est développé par vous mais est appelé par le cache distribué et s'exécute dans le cluster de cache. Avec l'aide de ce code, vous pouvez simplifier vos applications et déplacer une grande partie du code couramment utilisé vers le niveau de mise en cache.
Par exemple, NCache appelle votre gestionnaire de lecture lorsque votre application demande des données qui ne sont pas dans le cache et l'application indique NCache pour appeler Read-through dans ce cas. De même, vous pouvez combiner la lecture avec les expirations et les synchronisations de base de données pour recharger automatiquement l'élément mis en cache au lieu de le supprimer du cache.
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 |
using Alachisoft.NCache.Runtime.Caching; using Alachisoft.NCache.Runtime.DatasourceProviders; using Alachisoft.NCache.Runtime.Dependencies; public class SampleReadThruProvider : IReadThruProvider { public void Init(IDictionary parameters, string cacheId) { // Create SQL connection and other initializations at the server side } //Responsible for loading an item from the external data source. public void LoadFromSource(string key, out ProviderCacheItem cacheItem) { //where LoadFromDataSource is the dummy method to load data from data source. object value = LoadFromDataSource(key); //Attach SQL dependency to your object string query = "SELECT ProductID FROM dbo.Products WHERE ProductID = 1001"; cacheItem = new ProviderCacheItem(value); cacheItem.Dependency = new SqlCacheDependency(connectionString, query); //Set expirations cacheItem.SlidingExpiration = new TimeSpan(0, 5, 0); //Indicates whether item should be reloaded on expiration if //ReadThru provider is specified. cacheItem.ResyncItemOnExpiration = true; } public void Dispose() { //... } } |
L'écriture immédiate fonctionne de la même manière que la lecture immédiate, mais pour les mises à jour. Il met à jour votre base de données lorsque votre application met à jour le cache. Et, si vous préférez, Write-behind met à jour la base de données de manière asynchrone même si le cache est mis à jour de manière synchrone. Enfin, Cache Loader est appelé lorsque le cache est démarré afin que vous puissiez le précharger avec les données souhaitées.
Conclusion
Comme vous pouvez le voir, NCache, un cache distribué .NET open source, offre beaucoup plus de puissance à votre cache qu'un simple Redis magasin clé-valeur ou Memcached. Vous trouverez ci-dessous une comparaison détaillée du magasin de valeurs clés avec un service de cache distribué, c'est-à-dire Redis vs NCache et les Memcached vs NCache.