De nos jours, chaque entreprise a besoin de données pour gérer ses opérations. La meilleure solution pour stocker une collection de données bien organisée est une base de données. De même, le langage informatique le plus utilisé pour stocker et récupérer des données dans des bases de données est SQL (Structured Query Language). Dans un monde moderne en évolution rapide, il est crucial de pouvoir localiser les informations rapidement et efficacement.
NCache répond à ce besoin en spécifiant la clé pertinente où la clé primaire est utilisée pour trouver des données. En outre, NCache emploie également indexage dans de nombreux modules pour améliorer les performances de recherche sur le cache et en garder une trace. Comme dans les situations réelles, vous avez besoin de capacités de recherche flexibles pour pouvoir localiser des informations à l'aide de critères autres que la clé primaire.
Cependant, tous les attributs interrogeables doivent être indexés pour la recherche. Le stockage de calcul supplémentaire nécessaire pour stocker l'index ainsi que le temps nécessaire pour qu'une mise à jour se produise sont équilibrés avec le temps économisé lors de la récupération des informations.
Façons de définir des index
Pour définir des index, NCache fournit statique ainsi que le Dynamic indexage. Dans les deux cas, les index de requête pour une classe personnalisée doivent être prédéfinis afin de rechercher des éléments de cette classe dans le cache. En procédant ainsi, le cache stocke les informations d'une manière qui simplifie l'interrogation. Vous pouvez spécifier des index statiques via paramétrage ou en définissant indexe par programmation. Les index d'exécution ne nécessitent aucune configuration avant d'être utilisés.
Interroger l'index par programmation via NCache
NCache offre aux utilisateurs la polyvalence de créer des index en utilisant plusieurs méthodes. Vous pouvez générer des index pour des champs spécifiques ou pour la classe entière en fonction de vos besoins. NCache vous permet de interroger les index par programmation en utilisant les annotations suivantes :
- RequêteIndexable
- RequêteIndexée
- RequêteIndexée["indexName"]
- NonQueryIndexed
Configurer l'index de requête pour la classe
En utilisant l'attribut QueryIndexable, vous pouvez indexer votre classe. Il est défini au niveau de la classe pour signifier que la classe entière peut être indexée. Toutes les propriétés et tous les champs publics seront automatiquement indexés lorsqu'une classe est marquée comme QueryIndexable. Si un champ privé de votre classe doit être indexé, vous devez l'indiquer explicitement avec l'annotation QueryIndexed.
L'exemple suivant illustre l'indexation des champs de la classe nommée Produit en utilisant l'attribut QueryIndexable. Cela indexera l'ID, le nom, la quantité, le nom du fabricant, ainsi que le Prix unitaire.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[QueryIndexable] class Product { public int ID { get; set; } public string Name { get; set; } public string Quantity { get; set; } public string ManufacturerName { get; set; } public Decimal UnitPrice { get; set; } } |
Les objets de la classe qui sont indexés sont ajoutés dans le cache. L'exemple de code ci-dessous montre comment vous pouvez obtenir l'objet de la Produit classe mentionnée ci-dessus via une requête.
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 |
// Pre-conditions: Cache is already connected // Products are already present in the cache // Provide Fully Qualified Name (FQN) of your Product class // Create a query string query = "SELECT $Value$ FROM FQN.Product WHERE Quantity < ?"; // Use QueryCommand for query execution QueryCommand queryCommand = new QueryCommand(query); // Providing parameters for query queryCommand.Parameters.Add("Quantity", 500); // Executing QueryCommand through ICacheReader ICacheReader reader = cache.SearchService.ExecuteReader(queryCommand); // Checking if the result set is not empty if (reader.FieldCount > 0) { // Getting all Products with Quantity less then 500 while (reader.Read()) { Product product = reader.GetValue<Product>(1); // Perform required operations } } else { // Null query result set retrieved } |
Utilisez cette stratégie uniquement lorsque vous souhaitez interroger l'index de la totalité ou de la majorité des attributs ou des champs d'une classe. Sinon, il est déconseillé car il indexera potentiellement des caractéristiques qui ne sont pas nécessaires et finira par consommer de la mémoire supplémentaire.
Configurer les index de requête pour une propriété particulière
Lorsque vous n'avez besoin d'indexer que quelques propriétés ou champs d'une classe, utilisez Attribut QueryIndexed puisqu'il économise les performances et les coûts de mémoire. Pour indiquer qu'une propriété ou un champ marqué peut être indexé, il est défini au niveau de la propriété ou du champ primitif. Les champs ou attributs avec des annotations sont automatiquement indexés.
La classe Vol illustré ci-dessous montre comment indexer les attributs souhaités à l'aide de QueryIndexed sans indexer la classe entière. Juste pour les champs ID et TotalPassengers, NCache créera automatiquement des index.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class Flight { [QueryIndexed] public int ID { get; set; } [QueryIndexed] public int TotalPassangers { get; set; } public string FlightType; private string DepartAirport { get; set; } public AirLine Airline { get; set; } } |
Lorsque seul un petit nombre de propriétés ou de champs de votre classe doivent être indexés, vous pouvez utiliser cette méthode pour construire des index. Il vous donne la possibilité de sélectionner les propriétés ou les champs souhaités et d'indexer uniquement ceux-ci. Cette annotation vous évite le problème de mémoire qui peut survenir à la suite de l'interrogation de la classe entière alors que vous n'avez besoin que d'interroger certains attributs de celle-ci.
Configuration de l'index de requête fourni par l'utilisateur
Étant donné que l'utilisation de la propriété QueryIndexed pour l'indexation sélective entraîne ce comportement par défaut, le nom de l'index est le même que le nom du champ. Grâce à l'annotation QueryIndexed("indexName"), NCache vous permet de définir des noms uniques pour vos champs ou propriétés qui seront indexés. Si tel est le cas, un index est créé à l'aide du nom spécifié par l'utilisateur à partir du constructeur. Lorsque vous écrivez du code d'application dans plusieurs langues avec des noms de champ potentiellement distincts, cela peut être utile.
Dans la classe Employé, les champs ID de l'employé, date de naissance, ainsi que le Le salaire seront indexés car ils sont marqués avec l'attribut QueryIndexed. Cependant, pour créer un index englobant les champs, ID de l'employé et date de naissance, nom spécifié par l'utilisateur dans le constructeur "IDENTIFIANT" ainsi que le « date de naissance » sera utilisé.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class Employee { public string Name { get; set; } [QueryIndexed("ID")] public int EmployeeId { get; set; } [QueryIndexed("DOB")] public string DateOfBirth { get; set; } [QueryIndexed] public double Salary { get; set; } public string Position { get; set; } } |
Exclusion de champs de l'indexation
Lorsque votre classe est indexée, l'attribut NonQueryIndexed peut être utilisé pour arrêter l'indexation des propriétés ou des champs facultatifs. Lorsqu'une classe est déclarée comme QueryIndexable, l'attribut NonQueryIndexed est défini au niveau de la propriété ou du champ primitif pour spécifier que la propriété ou le champ ne doit pas être indexé. Les champs et propriétés publics seront tous automatiquement indexés. L'attribut NonQueryIndexed indique quels champs ne doivent pas être indexés.
L'exemple suivant montre comment déclarer explicitement le champ Nom du client comme NonQueryIndexed tandis que le Commander la classe est indexée. Cela ne tiendra pas compte de l'indexation du champ annoté.
1 2 3 4 5 6 7 8 9 10 11 12 |
[QueryIndexable] class Order { public int OrderId { get; set; } public DateTime OrderDate { get; set; } public string OrderDestination { get; set; } [NonQueryIndexed] public string CustomerName { get; set; } } |
Le champ Nom du client ne sera pas ajouté dans le cache. Lors de l'interrogation, vous obtiendrez la valeur de Nom du client comme null, alors que vous devez récupérer explicitement tous les autres champs.
Lorsque toutes les propriétés, sauf quelques-unes, doivent être indexées, vous pouvez combiner QueryIndexable avec NonQueryIndexed. Ceci est potentiellement utile lorsque vous disposez de données volumineuses et que vous souhaitez exclure uniquement une petite partie afin que les performances restent intactes.
Conclusion
NCache fournit un mécanisme rapide et efficace qui vous permet d'interroger votre index selon les critères établis. Et avec cette fonctionnalité, vous n'avez pas à vous soucier des problèmes de mémoire qui pourraient résulter de l'indexation des requêtes de la classe entière puisque vous n'avez besoin d'indexer que quelques-uns de ses champs. Indubitablement, NCacheLes différentes annotations d'index de requête sont une véritable bénédiction. Vous pouvez consulter d'autres NCache Caractéristiques sur notre site Web.