NCache est un magasin clé-valeur. Il récupère rapidement les éléments mis en cache par leur clé. Mais il peut également rechercher des entrées mises en cache par d'autres propriétés. Par exemple, au lieu de rechercher les produits mis en cache par leur clé, nous pouvons également les rechercher par catégorie, gamme de prix et poids. Apprenons à indexer les éléments mis en cache pour les rendre consultables.
Recherche
Outre la recherche d'éléments par leur clé, avec NCache, nous pouvons interroger les entrées mises en cache à l'aide d'une syntaxe de type SQL. Nous pouvons écrire des requêtes SELECT et DELETE pour rechercher et supprimer des entrées. NCache ne prend pas en charge les requêtes INSERT ou UPDATE. Comme une requête SELECT de base de données, nous pouvons récupérer des projections, des objets entiers mis en cache ou uniquement des clés. Aussi, NCache supports requête de base et opérateurs logiques et fonctions d'agrégation.
Par exemple, si nous stockons des produits, nous pouvons écrire une requête telle que SELECT FROM Product WHERE UnitPrice <= 5.00` pour trouver tous les produits mis en cache avec des prix inférieurs à 5. Pour plus d'exemples sur la façon de rechercher des éléments et d'utiliser des opérateurs et des fonctions d'agrégation , vérifiez à l'aide Requêtes SQL avec cache distribué.
Indexage
Contrairement aux bases de données relationnelles, pour rechercher des éléments par d'autres attributs, NCache nécessite des index. Sinon, il devrait analyser l'intégralité du cache pour trouver des éléments et leurs propriétés associées. Cela fera NCache lent. Avec les index, nos opérations de recherche sont plus rapides. Pour utiliser une propriété d'un objet dans une requête de recherche de type SQL, nous devons d'abord l'indexer. Nous pouvons indexer tous les champs et propriétés primitifs publics, privés et protégés d'un objet. Sachons que nous ne pouvons pas indexer les champs ou les propriétés de type référence. Une fois NCache ajoute un élément à un index, il est renvoyé à la suite d'une requête s'il répond aux critères de nos requêtes de recherche.
Il existe deux mécanismes pour définir des index avec NCache: indexation statique et dynamique.
Indexation statique
Pour rechercher des objets personnalisés, nous devons d'abord les indexer. Nous pouvons définir des index via des modifications de configuration ou par programmation.
Création d'index via la configuration
Nous pouvons créer des index en utilisant le NCache Manager ou une applet de commande Powershell. Tout d'abord, nous devons arrêter notre cache, créer nos index et le redémarrer. Le NCache Manager nous demande de télécharger l'assembly avec nos classes et de choisir les propriétés et les champs à indexer. Après cela, NCache indexe automatiquement les nouvelles entrées. Pour plus de détails sur le NCache Gestionnaire et Powershell Add-QueryIndex
applet de commande, vérifier Configurer les index de requête.
Création d'index par programmation
Pour créer des index par programmation, nous devons annoter les champs de nos objets pour les indexer. NCache a l' QueryIndexed
attribut pour indexer les champs et les propriétés.
Par exemple, pour indexer un nom de produit et son prix unitaire, il faut annoter son Name
ainsi que les UnitPrice
propriétés. Comme ça,
1 2 3 4 5 6 7 8 9 10 11 |
public class Product { public int ID { get; set } [QueryIndexed] public string Name { get; set } [QueryIndexed] public decimal UnitPrice { get; set } public decimal Weight { get; set } } |
Par défaut, NCache noms index après les propriétés annotées. Mais nous pouvons spécifier un nom différent avec le QueryIndexed
attribut. Cette fonctionnalité est utile lorsque vous travaillez avec deux applications clientes qui utilisent des noms différents pour la propriété que nous voulons indexer. Par exemple, si une application utilise UnitPrice
et un autre, pricePerUnit
; on peut utiliser price
comme nom d'index dans les deux applications et écrire nos requêtes de recherche de type SQL en utilisant price
à la place.
En plus d'annoter des propriétés individuelles, nous pouvons annoter des classes avec le QueryIndexable
attribut. Par ici, NCache indexe automatiquement toutes les propriétés et tous les champs publics. Mais nous devons annoter les champs privés avec QueryIndexed
. Et si nous ne voulons pas indexer certaines propriétés, nous devons les annoter avec NonQueryIndexed
. N'indexons une classe que si nous devons indexer toutes les propriétés. Mais adoptons l'approche consistant à n'indexer que les propriétés dont nous avons besoin pour la recherche, car l'ajout d'un trop grand nombre d'index entraîne une surcharge de mémoire et de performances.
Par exemple, pour indexer toutes les propriétés d'un produit, à l'exclusion Weight
, nous devons annoter la classe et le Weight
propriété. Comme ça,
1 2 3 4 5 6 7 8 9 10 11 12 |
[QueryIndexable] public class Product { public int ID { get; set } public string Name { get; set } public decimal UnitPrice { get; set } [NonQueryIndexed] public decimal Weight { get; set } } |
Pour plus de détails sur les annotations d'index, consultez Définir les index par programmation.
Indexation dynamique
Nous définissons certains attributs de nos entrées mises en cache au moment de l'exécution en utilisant le NCache client. Nous ne pouvons pas utiliser d'annotations pour indexer ces attributs. Pour les attributs d'exécution, NCache utilise l'indexation dynamique. Il existe trois types d'index dynamiques : les index de groupe, de balise et de balise nommée.
Indice de groupe
Avec les groupes, nous pouvons logiquement partitionner nos entrées pour plus d'efficacité. Les groupes fonctionnent comme des catégories logiques. Par exemple, nous pouvons utiliser des groupes pour nos « clients les plus importants » et les « produits fréquemment achetés ». Nous pouvons récupérer et supprimer toutes les entrées appartenant au même groupe. De plus, nous pouvons écrire des requêtes SELECT de type SQL en utilisant des groupes. NCache indexe automatiquement les groupes. Lorsque nous ajoutons une entrée à un groupe qui n'existe pas, NCache crée un index pour le groupe et stocke toutes les entrées appartenant à un groupe dans le même index. Pour en savoir plus sur les groupes, consultez Données du cache de groupe : un aperçu.
Index des balises
Les balises sont des identificateurs de chaîne que nous associons à nos entrées. Avec les balises, nous pouvons mieux organiser nos données puisque nous pouvons récupérer et supprimer des entrées en fonction de leurs balises. Contrairement aux groupes, nous pouvons associer une ou plusieurs balises à nos entrées de cache. Par exemple, nous pouvons catégoriser nos clients en fonction de leur emplacement en utilisant « Clients de la côte est » et « Clients de la côte ouest » comme balises. NCache prend en charge la recherche et la suppression d'entrées à l'aide d'un nom de balise ou de la syntaxe de requête de type SQL. On peut retrouver tous les éléments qui contiennent un ou plusieurs tags, par exemple : pour chaque nouveau tag, NCache crée un index de balises et enregistre tous les éléments mis en cache associés avec cet index.
Index des balises nommées
Les balises nommées sont des balises améliorées. Contrairement aux groupes et aux balises, qui ne prennent en charge que les chaînes comme identifiants, avec les balises nommées, nous pouvons associer des types de données primitifs, des chaînes et des dates à nos entrées. Les balises nommées sont une liste de paires clé-valeur attachées à nos entrées lors de l'exécution.
Par exemple, nous pouvons utiliser des balises nommées pour stocker la remise que nous accordons aux clients récurrents.
Pour rechercher et supprimer des entrées à l'aide de noms de balises ou de la syntaxe de type SQL, NCache crée automatiquement un index lorsque nous ajoutons des entrées avec des balises nommées qui n'existent pas. Aussi, NCache stocke tous les éléments mis en cache associés dans cet index. Étant donné que les index de balises nommées prennent en charge non seulement les chaînes, mais tous les types primitifs, nous avons l'alternative de rechercher des éléments avec une gamme plus large de types de données.
Pour en savoir plus sur les balises et les balises nommées, consultez le Données du cache de balises ainsi que les Balises nommées avec données de cache guides.
Conclusion
Grâce aux index et aux requêtes distribuées, NCache offre des capacités de recherche en temps réel avec une syntaxe de type SQL. Sans index, NCache devrait scanner l'intégralité du cache pour trouver nos entrées. C'est pourquoi NCache a besoin d'index. N'oublions pas que nous devons d'abord indexer tous les attributs interrogeables de nos articles. Nous pouvons définir nos index via la configuration, par programmation ou avec une combinaison des deux approches. Et n'indexons que les propriétés dont nous avons besoin dans nos requêtes. Les index ont des coûts de mémoire et de performances.
Pour plus de détails sur la création d'index et le fonctionnement des requêtes SQL, consultez la Guide d'indexation ainsi que les Requête SQL : aperçu du comportement et de l'utilisation.