Ogni impresa al giorno d'oggi ha bisogno di dati per gestire le proprie operazioni. La migliore soluzione per archiviare una raccolta di dati ben organizzata è un database. Allo stesso modo, il linguaggio informatico più utilizzato per l'archiviazione e il recupero dei dati nei database è SQL (Structured Query Language). In un mondo moderno così frenetico, è fondamentale essere in grado di individuare le informazioni in modo rapido ed efficace.
NCache soddisfa questa esigenza specificando la chiave pertinente in cui la chiave primaria viene utilizzata per trovare i dati. Inoltre, NCache impiega anche indicizzazione in molti moduli per migliorare le prestazioni di ricerca sulla cache e ne tiene traccia. Come nelle situazioni del mondo reale, sono necessarie funzionalità di ricerca flessibili per poter individuare le informazioni utilizzando criteri diversi dalla chiave primaria.
Tuttavia, tutti gli attributi ricercabili devono essere indicizzati per la ricerca. Lo spazio di archiviazione computazionale aggiuntivo necessario per archiviare l'indice e il tempo necessario per l'esecuzione di un aggiornamento è bilanciato con il tempo risparmiato durante il recupero delle informazioni.
Modi per definire gli indici
Per definire gli indici, NCache fornisce statico ed dinamico indicizzazione. In entrambi i casi, gli indici di query per una classe personalizzata devono essere predefiniti per cercare gli elementi di quella classe nella cache. In questo modo, la cache memorizza le informazioni in un modo che ne semplifica l'interrogazione. È possibile specificare indici statici tramite configurazione o definendo indici a livello di codice. Gli indici di runtime non richiedono alcuna configurazione prima di essere utilizzati.
Interrogazione dell'indice a livello di codice tramite NCache
NCache offre agli utenti versatilità per creare indici utilizzando diversi metodi. Puoi generare indici per campi specifici o per l'intera classe a seconda delle tue esigenze. NCache Consente di interrogare gli indici a livello di codice utilizzando le seguenti annotazioni:
- QueryIndicizzabile
- QueryIndicizzato
- QueryIndicizzata[“NomeIndice”]
- Non indicizzato dalla query
Configurare l'indice di query per la classe
Usando l'attributo QueryIndexable, puoi indicizzare la tua classe. È definito a livello di classe per indicare che l'intera classe può essere indicizzata. Tutte le proprietà e i campi pubblici verranno automaticamente indicizzati quando una classe viene contrassegnata come QueryIndexable. Se un campo privato nella tua classe deve essere indicizzato, devi indicarlo esplicitamente con l'annotazione QueryIndexed.
L'esempio seguente mostra l'indicizzazione dei campi della classe denominata Prodotto utilizzando l'attributo QueryIndexable. Questo indicizzerà l'ID, il nome, la quantità, il nome del produttore, ed Prezzo unitario.
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; } } |
Gli oggetti della classe che vengono indicizzati vengono aggiunti nella cache. L'esempio di codice seguente mostra come ottenere l'oggetto di Prodotto classe sopra menzionata tramite query.
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 } |
Solo quando desideri interrogare l'indicizzazione di tutti o della maggior parte degli attributi o dei campi di una classe dovresti utilizzare questa strategia. In caso contrario, è sconsigliato perché potenzialmente indicizzerà caratteristiche che non sono necessarie e finirà per consumare memoria aggiuntiva.
Configurare gli indici di query per una proprietà particolare
Quando hai bisogno di indicizzare solo poche proprietà o campi di una classe, usa Attributo QueryIndexed poiché consente di risparmiare prestazioni e costi di memoria. Per indicare che una proprietà o un campo contrassegnato può essere indicizzato, viene definito a livello di proprietà o campo primitivo. I campi o gli attributi con annotazioni vengono indicizzati automaticamente.
La classe Volo illustrato di seguito mostra come indicizzare gli attributi desiderati utilizzando QueryIndexed senza indicizzare l'intera classe. Solo per i campi ID e TotalPassengers, NCache creerà automaticamente gli indici.
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; } } |
Quando è necessario indicizzare solo un numero limitato di proprietà o campi nella classe, è possibile utilizzare questo metodo per costruire indici. Ti dà la possibilità di selezionare le proprietà o i campi desiderati e di indicizzare solo quelli. Questa annotazione ti salva dal problema di memoria che potrebbe sorgere a seguito dell'interrogazione dell'intera classe mentre devi solo interrogare alcuni attributi da essa.
Configurazione dell'indice di query fornita dall'utente
Poiché l'utilizzo della proprietà QueryIndexed per l'indicizzazione selettiva comporta questo comportamento predefinito, il nome dell'indice è uguale al nome del campo. Attraverso l'annotazione QueryIndexed(“indexName”), NCache ti consente di impostare nomi univoci per i tuoi campi o proprietà che verranno indicizzati. In tal caso, viene creato un indice utilizzando il nome specificato dall'utente dal costruttore. Quando si scrive il codice dell'applicazione in più lingue con nomi di campo potenzialmente distinti, questo può essere utile.
In classe Dipendente, i campi ID dipendente, Data di nascita, ed Incentivo verranno indicizzati in quanto contrassegnati con l'attributo QueryIndexed. Tuttavia, per creare un indice che includa i campi, EmployeeId e DateOfBirth, nome specificato dall'utente nel costruttore "ID" ed "DOB" verrà utilizzato.
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; } } |
Esclusione dei campi dall'indicizzazione
Quando la classe viene indicizzata, l'attributo NonQueryIndexed può essere utilizzato per interrompere l'indicizzazione di proprietà o campi facoltativi. Quando una classe viene dichiarata come QueryIndexable, l'attributo Non indicizzato dalla query è definito a livello della proprietà o del campo primitivo per specificare che la proprietà o il campo non devono essere indicizzati. I campi pubblici e le proprietà verranno tutti indicizzati automaticamente. L'attributo NonQueryIndexed indica quali campi non devono essere indicizzati.
Nell'esempio seguente viene illustrato come dichiarare in modo esplicito il campo Nome del cliente come NonQueryIndexed mentre il Ordina la classe è indicizzata. Ciò ignorerà l'indicizzazione del campo annotato.
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; } } |
Il campo Nome del cliente non verrà aggiunto nella cache. Dopo aver interrogato, otterrai il valore di Nome del cliente come null, mentre devi recuperare esplicitamente tutti gli altri campi.
Quando è necessario indicizzare tutte le proprietà tranne alcune, è possibile combinare QueryIndexable con NonQueryIndexed. Ciò è potenzialmente utile quando si dispone di dati di grandi dimensioni e si desidera escludere solo una piccola parte in modo che le prestazioni rimangano intatte.
Conclusione
NCache fornisce un meccanismo veloce ed efficiente che ti consente di interrogare il tuo indice secondo i criteri stabiliti. E con questa funzione, non devi preoccuparti dei problemi di memoria che potrebbero derivare dall'indicizzazione della query dell'intera classe poiché devi solo indicizzare alcuni dei suoi campi. Indubbiamente, NCacheLe diverse annotazioni dell'indice di query di sono una vera benedizione. Puoi dare un'occhiata ad altro NCache Caratteristiche dal nostro sito web.